[{"data":1,"prerenderedAt":2205},["ShallowReactive",2],{"/de-de/blog/we-need-to-talk-no-proxy":3,"navigation-de-de":1420,"banner-de-de":1851,"footer-de-de":1859,"blog-post-authors-de-de-Stan Hu":2100,"blog-related-posts-de-de-we-need-to-talk-no-proxy":2115,"blog-promotions-de-de":2141,"next-steps-de-de":2195},{"id":4,"title":5,"authors":6,"body":8,"category":1396,"date":1397,"description":1398,"extension":1399,"externalUrl":1400,"faq":1400,"featured":1401,"heroImage":1402,"meta":1403,"navigation":1404,"path":1405,"seo":1406,"slug":1410,"stem":1411,"tags":1412,"template":1417,"updatedDate":1418,"__hash__":1419},"blogPosts/de-de/blog/we-need-to-talk-no-proxy.md","Kann NO_PROXY standardisiert werden?",[7],"Stan Hu",{"type":9,"value":10,"toc":1379},"minimark",[11,28,31,36,39,58,65,93,99,116,119,124,141,158,168,172,201,209,241,259,262,266,269,431,435,452,458,461,465,477,493,500,698,713,793,805,860,863,872,875,879,882,917,920,933,942,981,989,997,1003,1060,1066,1076,1140,1149,1158,1219,1223,1240,1243,1247,1250,1258,1271,1275,1304,1310,1316,1362,1366,1375],[12,13,14,15,19,20,23,24,27],"p",{},"Wenn du schon einmal einen Web-Proxyserver verwendet hast, bist du wahrscheinlich mit den Umgebungsvariablen ",[16,17,18],"code",{},"http_proxy"," oder ",[16,21,22],{},"HTTP_PROXY"," vertraut. Weniger bekannt ist möglicherweise die Variable ",[16,25,26],{},"no_proxy",", mit der du bestimmten Datenverkehr für bestimmte Hosts von der Verwendung des Proxys ausschließen kannst. Obwohl HTTP ein gut definierter Standard ist, existiert kein einheitlicher Standard dafür, wie Clients diese Variablen behandeln sollten. Dies führt dazu, dass Webclients diese Variablen auf sehr unterschiedliche Weise unterstützen. Bei einem GitLab-Kunden führten eben diese Unterschiede zu einer wochenlangen Fehlersuche, um herauszufinden, warum bestimmte Dienste nicht mehr kommunizierten.",[12,29,30],{},"In diesem Artikel erfährst du, wie wir die Probleme analysiert und gelöst haben.",[32,33,35],"h2",{"id":34},"verwendung-des-proxyservers-konflikte-und-ausnahmen","Verwendung des Proxyservers: Konflikte und Ausnahmen",[12,37,38],{},"Die meisten Webclients unterstützen heutzutage die Verbindung zu Proxy-Servern über Umgebungsvariablen (Environment variables):",[40,41,42,48,53],"ul",{},[43,44,45],"li",{},[16,46,47],{},"http_proxy / HTTP_PROXY",[43,49,50],{},[16,51,52],{},"https_proxy / HTTPS_PROXY",[43,54,55],{},[16,56,57],{},"no_proxy / NO_PROXY",[12,59,60,61,64],{},"Diese Variablen sagen dem Client, welche URL genutzt werden sollte, um Zugang zu Proxyservern zu erhalten und welche Ausnahmen gemacht werden sollten. Wenn du zum Beispiel einen Proxyserver hast, der auf ",[16,62,63],{},"http://alice.example.com:8080"," überwacht wird, könntest du ihn verwenden via:",[66,67,72],"pre",{"className":68,"code":69,"language":70,"meta":71,"style":71},"language-sh shiki shiki-themes github-light","export http_proxy=http://alice.example.com:8080\n","sh","",[16,73,74],{"__ignoreMap":71},[75,76,79,83,87,90],"span",{"class":77,"line":78},"line",1,[75,80,82],{"class":81},"sD7c4","export",[75,84,86],{"class":85},"sgsFI"," http_proxy",[75,88,89],{"class":81},"=",[75,91,92],{"class":85},"http://alice.example.com:8080\n",[12,94,95,96,98],{},"Welcher Proxyserver wird verwendet, wenn Bob die Version in Großbuchstaben, ",[16,97,22],{},", ebenfalls definiert?",[66,100,102],{"className":68,"code":101,"language":70,"meta":71,"style":71},"export HTTP_PROXY=http://bob.example.com:8080\n",[16,103,104],{"__ignoreMap":71},[75,105,106,108,111,113],{"class":77,"line":78},[75,107,82],{"class":81},[75,109,110],{"class":85}," HTTP_PROXY",[75,112,89],{"class":81},[75,114,115],{"class":85},"http://bob.example.com:8080\n",[12,117,118],{},"Die Antwort ist uneindeutig: Es hängt vom jeweiligen Kontext ab. In einigen Fällen gewinnt der Proxy von Alice, in anderen Fällen gewinnt Bob.",[120,121,123],"h3",{"id":122},"ausnahmen-definieren","Ausnahmen definieren",[12,125,126,127,130,131,134,135,137,138,140],{},"Was passiert, wenn du Ausnahmen machen willst? Nehmen wir etwa an, du willst einen Proxyserver für alles außer ",[16,128,129],{},"internal.example.com"," und ",[16,132,133],{},"internal2.example.com"," verwenden. In diesem Fall kommt die Variable ",[16,136,26],{}," ins Spiel. Dann würdest du ",[16,139,26],{}," wie folgt definieren:",[66,142,144],{"className":68,"code":143,"language":70,"meta":71,"style":71},"export no_proxy=internal.example.com,internal2.example.com\n",[16,145,146],{"__ignoreMap":71},[75,147,148,150,153,155],{"class":77,"line":78},[75,149,82],{"class":81},[75,151,152],{"class":85}," no_proxy",[75,154,89],{"class":81},[75,156,157],{"class":85},"internal.example.com,internal2.example.com\n",[12,159,160,161,163,164,167],{},"Was ist, wenn du IP-Adressen ausschließen willst? Kann man Sternchen oder eine ",[16,162,26],{},"-Wildcard verwenden? Kann man CIDR-Blöcke verwenden (z. B. ",[16,165,166],{},"192.168.1.1/32",")? Auch hier gilt wieder: Es kommt darauf an.",[32,169,171],{"id":170},"geschichte-der-webclientswget-no_proxy-und-curlno_proxy","Geschichte der Webclients,wget no_proxy und cURLno_proxy",[12,173,174,175,178,179,181,182,184,185,187,188,190,191,193,194,200],{},"1994 haben die meisten Webclients CERN's ",[16,176,177],{},"libwww"," genutzt, welche ",[16,180,18],{}," und die ",[16,183,26],{}," Umgebungsvariable unterstützt haben. ",[16,186,177],{}," hat nur die kleingeschriebene Variante von ",[16,189,18],{}," verwendet. Somit war die ",[16,192,26],{},"-",[195,196,199],"a",{"href":197,"rel":198,"title":199},"https://github.com/w3c/libwww/blob/8678b3dcb4191065ca39caea54bb1beba809a617/Library/src/HTAccess.c#L234-L239",[],"Syntax"," sehr einfach:",[66,202,207],{"className":203,"code":205,"language":206,"meta":71},[204],"language-text","no_proxy ist eine mithilfe von Kommas oder Leerzeichen  getrennte Liste von Rechner-\noder Domain-Namen mit optionalem :port part. Wenn kein :port\npart vorhanden ist, wird sie für alle Ports auf der Domain angewendet.\n\nBeispiel:\n        no_proxy=\"cern.ch,some.domain:8001\"\n","text",[16,208,205],{"__ignoreMap":71},[12,210,211,212,214,215,218,219,222,223,225,226,228,229,231,232,234,235,237,238,240],{},"Es entstanden neue Clients, die ihre eigenen HTTP-Implementierungen hinzufügten, ohne auf ",[16,213,177],{}," zu verlinken. Im Januar 1996 veröffentlichte Hrvoje Niksic ",[16,216,217],{},"geturl",", den Vorgänger des heutigen ",[16,220,221],{},"wget",". Einen Monat später fügte ",[16,224,217],{}," in v1.1 Unterstützung für ",[16,227,18],{}," hinzu. Im Mai 1996 wurde mit ",[16,230,217],{}," v1.3 die Unterstützung für ",[16,233,26],{}," hinzugefügt. Genau wie ",[16,236,177],{}," unterstützte ",[16,239,217],{}," nur die Kleinbuchstabenform.",[12,242,243,244,247,248,130,250,252,253,255,256,258],{},"Im Januar 1998 veröffentlichte Daniel Stenberg ",[16,245,246],{},"curl"," v5.1, das die Variablen ",[16,249,18],{},[16,251,26],{}," unterstützte. Darüber hinaus erlaubte ",[16,254,246],{}," die Großbuchstaben HTTP_PROXY und NO_PROXY. Eine plötzliche Wendung: Im März 2009 wurde mit ",[16,257,246],{}," v7.19.4 die Unterstützung für die Großbuchstabenvariante von HTTP_PROXY aufgrund von Sicherheitsbedenken eingestellt. Während curl HTTP_PROXY ignoriert, funktioniert HTTPS_PROXY jedoch auch heute noch.",[12,260,261],{},"Heutzutage werden diese Proxyserver-Variablen je nach verwendeter Sprache oder Tool unterschiedlich gehandhabt.",[32,263,265],{"id":264},"http_proxy-und-https_proxy","http_proxy und https_proxy",[12,267,268],{},"In der folgenden Tabelle steht jede Zeile für ein unterstütztes Verfahren, während jede Spalte das Werkzeug (z.B. curl) oder die Sprache (z.B. Ruby) enthält, für die es gilt:",[270,271,272,294],"table",{},[273,274,275],"thead",{},[276,277,278,281,283,285,288,291],"tr",{},[279,280],"th",{},[279,282,246],{},[279,284,221],{},[279,286,287],{},"Ruby",[279,289,290],{},"Python",[279,292,293],{},"Go",[295,296,297,315,344,361,378,395],"tbody",{},[276,298,299,304,307,309,311,313],{},[300,301,302],"td",{},[16,303,18],{},[300,305,306],{},"Ja",[300,308,306],{},[300,310,306],{},[300,312,306],{},[300,314,306],{},[276,316,317,321,324,326,335,342],{},[300,318,319],{},[16,320,22],{},[300,322,323],{},"Nein",[300,325,323],{},[300,327,328,329,334],{},"Ja (",[195,330,333],{"href":331,"rel":332},"https://github.com/ruby/ruby/blob/0ed71b37fa9af134fdd5a7fd1cebd171eba83541/lib/uri/generic.rb#L1519",[],"warning",")",[300,336,337,338,341],{},"Ja (wenn ",[16,339,340],{},"REQUEST_METHOD"," nicht in env)",[300,343,306],{},[276,345,346,351,353,355,357,359],{},[300,347,348],{},[16,349,350],{},"https_proxy",[300,352,306],{},[300,354,306],{},[300,356,306],{},[300,358,306],{},[300,360,306],{},[276,362,363,368,370,372,374,376],{},[300,364,365],{},[16,366,367],{},"HTTPS_PROXY",[300,369,306],{},[300,371,323],{},[300,373,306],{},[300,375,306],{},[300,377,306],{},[276,379,380,383,386,388,390,392],{},[300,381,382],{},"Präzedenzfall",[300,384,385],{},"Kleinschreibung",[300,387,385],{},[300,389,385],{},[300,391,385],{},[300,393,394],{},"Großschreibung",[276,396,397,400,407,413,419,425],{},[300,398,399],{},"Referenz",[300,401,402],{},[195,403,406],{"href":404,"rel":405},"https://github.com/curl/curl/blob/30e7641d7d2eb46c0b67c0c495a0ea7e52333ee2/lib/url.c#L2250-L2266",[],"Quelle",[300,408,409],{},[195,410,406],{"href":411,"rel":412},"https://github.com/jay/wget/blob/099d8ee3da3a6eea5635581ae517035165f400a5/src/retr.c#L1222-L1239",[],[300,414,415],{},[195,416,406],{"href":417,"rel":418},"https://github.com/ruby/ruby/blob/0ed71b37fa9af134fdd5a7fd1cebd171eba83541/lib/uri/generic.rb#L1474-L1543",[],[300,420,421],{},[195,422,406],{"href":423,"rel":424},"https://github.com/python/cpython/blob/030a713183084594659aefd77b76fe30178e23c8/Lib/urllib/request.py#L2488-L2517",[],[300,426,427],{},[195,428,406],{"href":429,"rel":430},"https://github.com/golang/go/blob/682a1d2176b02337460aeede0ff9e49429525195/src/vendor/golang.org/x/net/http/httpproxy/proxy.go#L82-L97",[],[120,432,434],{"id":433},"proxy-variablen-in-python-und-go-der-unterschied-zwischen-groß-und-kleinschreibung","Proxy-Variablen in Python und Go: Der Unterschied zwischen Groß- und Kleinschreibung",[12,436,437,438,130,440,442,443,445,446,448,449,451],{},"Beachte, dass ",[16,439,18],{},[16,441,350],{}," immer durchgängig unterstützt werden, während ",[16,444,22],{}," nicht immer unterstützt wird. Python (über urllib) verkompliziert das Bild noch mehr: ",[16,447,22],{}," kann so lange verwendet werden, wie ",[16,450,340],{}," nicht in der Umgebung definiert ist.",[12,453,454,455,457],{},"Während man erwarten könnte, dass Umgebungsvariablen in Großbuchstaben geschrieben werden, war ",[16,456,18],{}," zuerst da und ist damit also der De-facto-Standard. Im Zweifelsfall sollte man sich für die Kleinschreibung entscheiden, da diese universell unterstützt wird.",[12,459,460],{},"Im Gegensatz zu den meisten Implementierungen versucht Go es mit Großbuchstaben, bevor es auf die Kleinschreibung zurückgreift. Wir werden später noch sehen, warum genau diese Vorgehensweise bei einem GitLab-Kunden zu Problemen führte.",[120,462,464],{"id":463},"no_proxy-im-gleichen-issue","no_proxy im gleichen Issue",[12,466,467,468,470,471,473,474,476],{},"Einige Benutzer(innen) haben das Fehlen der ",[16,469,26],{},"-Spezifikation in diesem Issue diskutiert. Da ",[16,472,26],{}," eine Ausschlussliste spezifiziert, stellen sich viele Fragen zu ihrem Verhalten. Nehmen wir zum Beispiel an, deine ",[16,475,26],{},"-Konfiguration ist definiert:",[66,478,480],{"className":68,"code":479,"language":70,"meta":71,"style":71},"export no_proxy=example.com\n",[16,481,482],{"__ignoreMap":71},[75,483,484,486,488,490],{"class":77,"line":78},[75,485,82],{"class":81},[75,487,152],{"class":85},[75,489,89],{"class":81},[75,491,492],{"class":85},"example.com\n",[12,494,495,496,499],{},"Bedeutet dies, dass die Domain ein exaktes Match sein muss oder wird ",[16,497,498],{},"subdomain.example.com"," auch mit dieser Konfiguration übereinstimmen? Die folgende Tabelle zeigt den Status der verschiedenen Implementierungen. Es stellt sich heraus, dass alle Implementierungen Suffixe korrekt abgleichen, wie in der Zeile “Stimmt mit Suffixen überein” zu sehen ist:",[270,501,502,518],{},[273,503,504],{},[276,505,506,508,510,512,514,516],{},[279,507],{},[279,509,246],{},[279,511,221],{},[279,513,287],{},[279,515,290],{},[279,517,293],{},[295,519,520,536,553,567,582,601,619,634,649,664],{},[276,521,522,526,528,530,532,534],{},[300,523,524],{},[16,525,26],{},[300,527,306],{},[300,529,306],{},[300,531,306],{},[300,533,306],{},[300,535,306],{},[276,537,538,543,545,547,549,551],{},[300,539,540],{},[16,541,542],{},"NO_PROXY",[300,544,306],{},[300,546,323],{},[300,548,306],{},[300,550,306],{},[300,552,306],{},[276,554,555,557,559,561,563,565],{},[300,556,382],{},[300,558,385],{},[300,560,385],{},[300,562,385],{},[300,564,385],{},[300,566,394],{},[276,568,569,572,574,576,578,580],{},[300,570,571],{},"Stimmt mit Suffixen überein?",[300,573,306],{},[300,575,306],{},[300,577,306],{},[300,579,306],{},[300,581,306],{},[276,583,584,591,593,595,597,599],{},[300,585,586,587,590],{},"Strips leading ",[16,588,589],{},".","?",[300,592,306],{},[300,594,323],{},[300,596,306],{},[300,598,306],{},[300,600,323],{},[276,602,603,609,611,613,615,617],{},[300,604,605,608],{},[16,606,607],{},"*"," Stimmt mit allen Hosts überein?",[300,610,306],{},[300,612,323],{},[300,614,323],{},[300,616,306],{},[300,618,306],{},[276,620,621,624,626,628,630,632],{},[300,622,623],{},"Unterstützt Regexe?",[300,625,323],{},[300,627,323],{},[300,629,323],{},[300,631,323],{},[300,633,323],{},[276,635,636,639,641,643,645,647],{},[300,637,638],{},"Unterstützt CIDR-Blöcke?",[300,640,323],{},[300,642,323],{},[300,644,306],{},[300,646,323],{},[300,648,306],{},[276,650,651,654,656,658,660,662],{},[300,652,653],{},"Erkennt Loopback-IPs?",[300,655,323],{},[300,657,323],{},[300,659,323],{},[300,661,323],{},[300,663,306],{},[276,665,666,668,674,680,686,692],{},[300,667,399],{},[300,669,670],{},[195,671,406],{"href":672,"rel":673},"https://github.com/curl/curl/blob/30e7641d7d2eb46c0b67c0c495a0ea7e52333ee2/lib/url.c#L2152-L2206",[],[300,675,676],{},[195,677,406],{"href":678,"rel":679},"https://github.com/jay/wget/blob/099d8ee3da3a6eea5635581ae517035165f400a5/src/retr.c#L1266-L1274",[],[300,681,682],{},[195,683,406],{"href":684,"rel":685},"https://github.com/ruby/ruby/blob/0ed71b37fa9af134fdd5a7fd1cebd171eba83541/lib/uri/generic.rb#L1545-L1554",[],[300,687,688],{},[195,689,406],{"href":690,"rel":691},"https://github.com/python/cpython/blob/030a713183084594659aefd77b76fe30178e23c8/Lib/urllib/request.py#L2519-L2551",[],[300,693,694],{},[195,695,406],{"href":696,"rel":697},"https://github.com/golang/go/blob/682a1d2176b02337460aeede0ff9e49429525195/src/vendor/golang.org/x/net/http/httpproxy/proxy.go#L170-L206",[],[12,699,700,701,703,704,706,707,709,710,712],{},"Wenn jedoch ein vorangestellter. in der ",[16,702,26],{},"-Einstellung vorhanden ist, variiert das Verhalten. Zum Beispiel verhalten sich ",[16,705,246],{}," und  ",[16,708,221],{}," unterschiedlich. ",[16,711,246],{}," entfernt immer den vorangestellten . und nimmt den Vergleich mit einem Domain-Suffix vor. Dieser Aufruf umgeht den Proxy:",[66,714,716],{"className":68,"code":715,"language":70,"meta":71,"style":71},"$ env https_proxy=http://non.existent/ no_proxy=.gitlab.com curl https://gitlab.com\n\u003Chtml>\u003Cbody>You are being \u003Ca href=\"https://about.gitlab.com/\">redirected\u003C/a>.\u003C/body>\u003C/html>\n",[16,717,718,740],{"__ignoreMap":71},[75,719,720,724,728,731,734,737],{"class":77,"line":78},[75,721,723],{"class":722},"s7eDp","$",[75,725,727],{"class":726},"sYBdl"," env",[75,729,730],{"class":726}," https_proxy=http://non.existent/",[75,732,733],{"class":726}," no_proxy=.gitlab.com",[75,735,736],{"class":726}," curl",[75,738,739],{"class":726}," https://gitlab.com\n",[75,741,743,746,749,752,755,757,760,762,765,767,770,772,775,777,779,781,784,787,790],{"class":77,"line":742},2,[75,744,745],{"class":81},"\u003C",[75,747,748],{"class":85},"html>\u003Cbody",[75,750,751],{"class":81},">",[75,753,754],{"class":85},"You are being ",[75,756,745],{"class":81},[75,758,759],{"class":85},"a href",[75,761,89],{"class":81},[75,763,764],{"class":726},"\"https://about.gitlab.com/\"",[75,766,751],{"class":81},[75,768,769],{"class":726},"redirected",[75,771,745],{"class":81},[75,773,774],{"class":726},"/a",[75,776,751],{"class":81},[75,778,589],{"class":726},[75,780,745],{"class":81},[75,782,783],{"class":726},"/body",[75,785,786],{"class":85},">\u003C",[75,788,789],{"class":726},"/html",[75,791,792],{"class":81},">\n",[12,794,795,796,798,799,801,802,804],{},"Allerdings entfernt  ",[16,797,221],{}," den vorangestellten",[16,800,589],{}," nicht und führt eine exakte String-Übereinstimmung mit einem Hostnamen durch. Infolgedessen versucht  ",[16,803,221],{},", einen Proxy zu verwenden, wenn eine Top-Level-Domain verwendet wird:",[66,806,808],{"className":68,"code":807,"language":70,"meta":71,"style":71},"$ env https_proxy=http://non.existent/ no_proxy=.gitlab.com wget https://gitlab.com\nResolving non.existent (non.existent)... failed: Name or service not known.\nwget: unable to resolve host address 'non.existent'\n",[16,809,810,825,836],{"__ignoreMap":71},[75,811,812,814,816,818,820,823],{"class":77,"line":78},[75,813,723],{"class":722},[75,815,727],{"class":726},[75,817,730],{"class":726},[75,819,733],{"class":726},[75,821,822],{"class":726}," wget",[75,824,739],{"class":726},[75,826,827,830,833],{"class":77,"line":742},[75,828,829],{"class":722},"Resolving",[75,831,832],{"class":726}," non.existent",[75,834,835],{"class":85}," (non.existent)... failed: Name or service not known.\n",[75,837,839,842,845,848,851,854,857],{"class":77,"line":838},3,[75,840,841],{"class":722},"wget:",[75,843,844],{"class":726}," unable",[75,846,847],{"class":726}," to",[75,849,850],{"class":726}," resolve",[75,852,853],{"class":726}," host",[75,855,856],{"class":726}," address",[75,858,859],{"class":726}," 'non.existent'\n",[12,861,862],{},"In keiner der Implementierungen werden reguläre Ausdrücke unterstützt. Die Verwendung von Regexes würde die Angelegenheit zusätzlich verkomplizieren, da es verschiedene Varianten gibt (z. B. PCRE, POSIX usw.). Darüber hinaus führen Regexes zu potenziellen Leistungs- und Sicherheitsproblemen.",[12,864,865,866,868,869,871],{},"In einigen Fällen können Proxys durch das Setzen der ",[16,867,26],{},"-Variable auf * vollständig deaktiviert werden, aber dies ist keine allgemeingültige Regel. Keine Implementierung führt einen DNS-Lookup durch, um einen Hostnamen in eine IP-Adresse aufzulösen, wenn entschieden wird, ob ein Proxy verwendet werden soll. Daher sollten keine IP-Adressen in der ",[16,870,26],{},"-Variable angegeben werden, es sei denn, es wird erwartet, dass die IPs explizit vom Client verwendet werden.",[12,873,874],{},"Dasselbe gilt für CIDR-Blöcke wie z. B. 18.240.0.1/24. CIDR-Blöcke funktionieren nur, wenn die Anfrage direkt an eine IP-Adresse gestellt wird. Nur Go und Ruby erlauben die Verwendung von CIDR-Blöcken. Im Gegensatz zu anderen Implementierungen deaktiviert Go sogar automatisch die Verwendung eines Proxys, wenn eine Loopback-IP-Adresse erkannt wird.",[32,876,878],{"id":877},"fehlerbehebung-bei-proxy-konfigurationen-wie-unterschiedliche-no_proxy-einstellungen-gitlab-prozesse-beeinträchtigen","Fehlerbehebung bei Proxy-Konfigurationen: Wie unterschiedliche no_proxy-Einstellungen GitLab-Prozesse beeinträchtigen",[12,880,881],{},"Wenn die Anwendung in mehreren Sprachen geschrieben ist und hinter einer Unternehmensfirewall mit einem Proxyserver arbeiten muss, solltest du auf diese Unterschiede achten. GitLab besteht zum Beispiel aus einigen in Ruby und Go geschriebenen Diensten. Ein Kunde hat seine Proxy-Konfiguration in etwa wie folgt eingestellt:",[66,883,887],{"className":884,"code":885,"language":886,"meta":71,"style":71},"language-yaml shiki shiki-themes github-light","HTTP_PROXY: http://proxy.company.com\nHTTPS_PROXY: http://proxy.company.com\nNO_PROXY: .correct-company.com\n","yaml",[16,888,889,900,908],{"__ignoreMap":71},[75,890,891,894,897],{"class":77,"line":78},[75,892,22],{"class":893},"shJU0",[75,895,896],{"class":85},": ",[75,898,899],{"class":726},"http://proxy.company.com\n",[75,901,902,904,906],{"class":77,"line":742},[75,903,367],{"class":893},[75,905,896],{"class":85},[75,907,899],{"class":726},[75,909,910,912,914],{"class":77,"line":838},[75,911,542],{"class":893},[75,913,896],{"class":85},[75,915,916],{"class":726},".correct-company.com\n",[12,918,919],{},"Der Kunde meldete das folgende Problem mit GitLab:",[921,922,923,930],"ol",{},[43,924,925,926,929],{},"Ein ",[16,927,928],{},"git push"," über die Befehlszeile funktionierte",[43,931,932],{},"Über die Web-UI vorgenommene Git-Änderungen schlugen fehl",[12,934,935,936,941],{},"Unsere Support-Techniker stellten fest, dass aufgrund eines Konfigurationsproblems bei ",[195,937,940],{"href":938,"rel":939,"title":940},"https://about.gitlab.com/de-de/solutions/kubernetes/",[],"Kubernetes"," einige veraltete Werte zurückblieben. Der Pod hatte eine Umgebung, die in etwa so aussah:",[66,943,945],{"className":884,"code":944,"language":886,"meta":71,"style":71},"HTTP_PROXY: http://proxy.company.com\nHTTPS_PROXY: http://proxy.company.com\nNO_PROXY: .correct-company.com\nno_proxy: .wrong-company.com\n",[16,946,947,955,963,971],{"__ignoreMap":71},[75,948,949,951,953],{"class":77,"line":78},[75,950,22],{"class":893},[75,952,896],{"class":85},[75,954,899],{"class":726},[75,956,957,959,961],{"class":77,"line":742},[75,958,367],{"class":893},[75,960,896],{"class":85},[75,962,899],{"class":726},[75,964,965,967,969],{"class":77,"line":838},[75,966,542],{"class":893},[75,968,896],{"class":85},[75,970,916],{"class":726},[75,972,974,976,978],{"class":77,"line":973},4,[75,975,26],{"class":893},[75,977,896],{"class":85},[75,979,980],{"class":726},".wrong-company.com\n",[12,982,983,984,130,986,988],{},"Die inkonsistenten Definitionen in ",[16,985,26],{},[16,987,542],{}," waren ein Warnsignal, und wir hätten das Problem lösen können, indem wir sie konsistent gemacht oder den falschen Eintrag entfernt hätten. Aber sehen wir uns an, was passiert ist:",[921,990,991,994],{},[43,992,993],{},"Ruby versucht es zuerst mit der kleingeschriebenen Variante",[43,995,996],{},"Go versucht es zuerst mit der Variante in Großbuchstaben",[12,998,999,1000,1002],{},"Infolgedessen hatten in Go geschriebene Dienste wie GitLab Workhorse die richtige Proxy-Konfiguration. Ein ",[16,1001,928],{}," von der Befehlszeile aus funktionierte problemlos, da die Go-Dienste diesen Vorgang primär abwickelten:",[66,1004,1008],{"className":1005,"code":1006,"language":1007,"meta":71,"style":71},"language-mermaid shiki shiki-themes github-light","sequenceDiagram\n    autonumber\n    participant C as Client\n    participant W as Workhorse\n    participant G as Gitaly\n    C->>W: git push\n    W->>G: gRPC: PostReceivePack\n    G->>W: OK\n    W->>C: OK\n","mermaid",[16,1009,1010,1015,1020,1025,1030,1036,1042,1048,1054],{"__ignoreMap":71},[75,1011,1012],{"class":77,"line":78},[75,1013,1014],{"class":85},"sequenceDiagram\n",[75,1016,1017],{"class":77,"line":742},[75,1018,1019],{"class":85},"    autonumber\n",[75,1021,1022],{"class":77,"line":838},[75,1023,1024],{"class":85},"    participant C as Client\n",[75,1026,1027],{"class":77,"line":973},[75,1028,1029],{"class":85},"    participant W as Workhorse\n",[75,1031,1033],{"class":77,"line":1032},5,[75,1034,1035],{"class":85},"    participant G as Gitaly\n",[75,1037,1039],{"class":77,"line":1038},6,[75,1040,1041],{"class":85},"    C->>W: git push\n",[75,1043,1045],{"class":77,"line":1044},7,[75,1046,1047],{"class":85},"    W->>G: gRPC: PostReceivePack\n",[75,1049,1051],{"class":77,"line":1050},8,[75,1052,1053],{"class":85},"    G->>W: OK\n",[75,1055,1057],{"class":77,"line":1056},9,[75,1058,1059],{"class":85},"    W->>C: OK\n",[12,1061,1062,1063,1065],{},"Der gRPC-Aufruf in Schritt 2 hat nie versucht, den Proxy zu verwenden, da ",[16,1064,26],{}," richtig konfiguriert wurde, um eine direkte Verbindung zu Gitaly herzustellen.",[12,1067,1068,1069,1072,1073,1075],{},"Wenn jedoch ein(e) Benutzer(in) eine Änderung in der Bedienoberfläche vornimmt, leitet Gitaly die Anfrage an einen ",[16,1070,1071],{},"gitaly-ruby","-Service weiter, der in Ruby geschrieben ist.  ",[16,1074,1071],{}," nimmt Änderungen am Repository vor und meldet diese über einen gRPC-Aufruf an seinen übergeordneten Prozess zurück. Wie in Schritt 4 unten zu sehen ist, fand der Reporting-Schritt jedoch nicht statt:",[66,1077,1079],{"className":1005,"code":1078,"language":1007,"meta":71,"style":71},"sequenceDiagram\n    autonumber\n    participant C as Client\n    participant R as Rails\n    participant G as Gitaly\n    participant GR as gitaly-ruby\n    participant P as Proxy\n    C->>R: Change file in UI\n    R->>G: gRPC: UserCommitFiles\n    G->>GR: gRPC: UserCommitFiles\n    GR->>P: CONNECT\n    P->>GR: FAIL\n",[16,1080,1081,1085,1089,1093,1098,1102,1107,1112,1117,1122,1128,1134],{"__ignoreMap":71},[75,1082,1083],{"class":77,"line":78},[75,1084,1014],{"class":85},[75,1086,1087],{"class":77,"line":742},[75,1088,1019],{"class":85},[75,1090,1091],{"class":77,"line":838},[75,1092,1024],{"class":85},[75,1094,1095],{"class":77,"line":973},[75,1096,1097],{"class":85},"    participant R as Rails\n",[75,1099,1100],{"class":77,"line":1032},[75,1101,1035],{"class":85},[75,1103,1104],{"class":77,"line":1038},[75,1105,1106],{"class":85},"    participant GR as gitaly-ruby\n",[75,1108,1109],{"class":77,"line":1044},[75,1110,1111],{"class":85},"    participant P as Proxy\n",[75,1113,1114],{"class":77,"line":1050},[75,1115,1116],{"class":85},"    C->>R: Change file in UI\n",[75,1118,1119],{"class":77,"line":1056},[75,1120,1121],{"class":85},"    R->>G: gRPC: UserCommitFiles\n",[75,1123,1125],{"class":77,"line":1124},10,[75,1126,1127],{"class":85},"    G->>GR: gRPC: UserCommitFiles\n",[75,1129,1131],{"class":77,"line":1130},11,[75,1132,1133],{"class":85},"    GR->>P: CONNECT\n",[75,1135,1137],{"class":77,"line":1136},12,[75,1138,1139],{"class":85},"    P->>GR: FAIL\n",[12,1141,1142,1143,1145,1146,1148],{},"Da gRPC HTTP/2 als Transport verwendet, versuchte  ",[16,1144,1071],{}," einen CONNECT zum Proxy, da es mit der falschen ",[16,1147,26],{},"-Einstellung konfiguriert war. Der Proxy lehnte diese HTTP-Anfrage sofort ab, was den Fehler im Web-UI-Push-Case verursachte.",[12,1150,1151,1152,1154,1155,1157],{},"Nachdem wir den Kleinbuchstaben ",[16,1153,26],{}," aus der Umgebung entfernt hatten, funktionierte der Push von der Bedienoberfläche wie erwartet, und  ",[16,1156,1071],{}," verband sich direkt mit dem übergeordneten Gitaly-Prozess. Schritt 4 funktionierte, wie im folgenden Diagramm dargestellt:",[66,1159,1161],{"className":1005,"code":1160,"language":1007,"meta":71,"style":71},"sequenceDiagram\n    autonumber\n    participant C as Client\n    participant R as Rails\n    participant G as Gitaly\n    participant GR as gitaly-ruby\n    participant P as Proxy\n    C->>R: Change file in UI\n    R->>G: gRPC: UserCommitFiles\n    G->>GR: gRPC: UserCommitFiles\n    GR->>G: OK\n    G->>R: OK\n    R->>C: OK\n",[16,1162,1163,1167,1171,1175,1179,1183,1187,1191,1195,1199,1203,1208,1213],{"__ignoreMap":71},[75,1164,1165],{"class":77,"line":78},[75,1166,1014],{"class":85},[75,1168,1169],{"class":77,"line":742},[75,1170,1019],{"class":85},[75,1172,1173],{"class":77,"line":838},[75,1174,1024],{"class":85},[75,1176,1177],{"class":77,"line":973},[75,1178,1097],{"class":85},[75,1180,1181],{"class":77,"line":1032},[75,1182,1035],{"class":85},[75,1184,1185],{"class":77,"line":1038},[75,1186,1106],{"class":85},[75,1188,1189],{"class":77,"line":1044},[75,1190,1111],{"class":85},[75,1192,1193],{"class":77,"line":1050},[75,1194,1116],{"class":85},[75,1196,1197],{"class":77,"line":1056},[75,1198,1121],{"class":85},[75,1200,1201],{"class":77,"line":1124},[75,1202,1127],{"class":85},[75,1204,1205],{"class":77,"line":1130},[75,1206,1207],{"class":85},"    GR->>G: OK\n",[75,1209,1210],{"class":77,"line":1136},[75,1211,1212],{"class":85},"    G->>R: OK\n",[75,1214,1216],{"class":77,"line":1215},13,[75,1217,1218],{"class":85},"    R->>C: OK\n",[120,1220,1222],{"id":1221},"eine-überraschende-entdeckung-mit-grpc","Eine überraschende Entdeckung mit gRPC",[12,1224,1225,1226,1228,1229,1231,1232,1235,1236,1239],{},"Beachte, dass der Kunde ",[16,1227,367],{}," auf einen unverschlüsselten ",[16,1230,22],{}," gesetzt hat; beachte, dass ",[16,1233,1234],{},"http://"," anstelle von ",[16,1237,1238],{},"https://"," verwendet wird. Dies ist zwar vom Standpunkt der Sicherheit aus nicht ideal, aber es kann gemacht werden, um zu vermeiden, dass Clients aufgrund von Problemen bei der TLS-Zertifikatsüberprüfung scheitern.",[12,1241,1242],{},"Ironischerweise wäre dieses Problem nicht aufgetreten, wenn ein HTTPS-Proxy angegeben worden wäre. Wenn ein HTTPS-Proxy verwendet wird, ignoriert gRPC diese Einstellung, da HTTPS-Proxys nicht unterstützt werden.",[32,1244,1246],{"id":1245},"der-kleinste-gemeinsame-nenner","Der kleinste gemeinsame Nenner",[12,1248,1249],{},"Man sollte niemals inkonsistente Werte mit Proxy-Einstellungen in Klein- und Großbuchstaben definieren. Falls du allerdings jemals einen Stack verwalten musst, der in mehreren Sprachen geschrieben ist, solltest du in Erwägung ziehen, HTTP-Proxy-Konfigurationen auf den kleinsten gemeinsamen Nenner zu setzen:",[1251,1252,1254,130,1256],"h4",{"id":1253},"http_proxy-und-https_proxy-1",[16,1255,18],{},[16,1257,350],{},[40,1259,1260],{},[43,1261,1262,1263,1265,1266],{},"Verwende die Kleinschreibung. ",[16,1264,22],{},"  wird nicht immer unterstützt oder empfohlen.\n",[40,1267,1268],{},[43,1269,1270],{},"Wenn du unbedingt die Variante mit Großbuchstaben verwenden musst, achte darauf, dass sie denselben Wert hat.",[1251,1272,1273],{"id":26},[16,1274,26],{},[921,1276,1277,1280,1287,1298,1301],{},[43,1278,1279],{},"Verwende die Kleinschreibung.",[43,1281,1282,1283,1286],{},"Nutze durch Kommas getrennte ",[16,1284,1285],{},"hostname:port"," Werte.",[43,1288,1289,1290,1293,1294,1297],{},"IP-Adressen sind okay, aber Hostnamen werden nie aufgelöst. 4. Endungen werden immer zugeordnet (z.B. ",[16,1291,1292],{},"example.com"," wird ",[16,1295,1296],{},"test.example.com"," zugeordnet).",[43,1299,1300],{},"Wenn Top-Level-Domains abgeglichen werden müssen, solltest du einen vorangestellten Punkt vermeiden (.).",[43,1302,1303],{},"Vermeide die Verwendung von CIDR-Matching, da dies nur von Go und Ruby unterstützt wird.",[32,1305,1307,1308],{"id":1306},"standardisierung-von-no_proxy","Standardisierung von ",[16,1309,26],{},[12,1311,1312,1313,1315],{},"Die Kenntnis des kleinsten gemeinsamen Nenners kann helfen, Probleme zu vermeiden, wenn diese Definitionen für verschiedene Webclients kopiert werden. Aber sollte es für ",[16,1314,26],{}," und die anderen Proxy-Einstellungen einen dokumentierten Standard geben und nicht nur eine Ad-hoc-Übereinstimmung? Die folgende Liste kann als Ausgangspunkt für einen Vorschlag dienen:",[921,1317,1318,1327,1338,1341,1347,1353,1356],{},[43,1319,1320,1321,1323,1324,1326],{},"Bevorzugung von Kleinbuchstaben gegenüber Großbuchstaben bei Variablen (z. B.  ",[16,1322,18],{}," sollte vor ",[16,1325,22],{}," gesucht werden).",[43,1328,1329,1330,1332,1333],{},"Verwende durch  Kommas getrennte Werte für ",[16,1331,1285],{},".\n",[40,1334,1335],{},[43,1336,1337],{},"Jeder Wert kann optionale Leerzeichen enthalten.",[43,1339,1340],{},"Führe niemals DNS-Lookups durch und verwende keine regulären Formeln.",[43,1342,1343,1344,1346],{},"Nutze ",[16,1345,607],{}," um alle Hosts zu verbinden.",[43,1348,1349,1350,1352],{},"Führende Punkte (",[16,1351,589],{},") werden entfernt und mit Domain-Suffixen abgeglichen.",[43,1354,1355],{},"Unterstützung des CIDR-Blockabgleichs.",[43,1357,1358,1359,1361],{},"Stelle niemals Vermutungen über spezielle IP-Adressen an (z. B. Loopback-IP-Adressen in ",[16,1360,26],{},").",[32,1363,1365],{"id":1364},"fazit","Fazit",[12,1367,1368,1369,1371,1372,1374],{},"Seit der Veröffentlichung des ersten Web-Proxys sind über 25 Jahre vergangen. Obwohl sich die grundlegenden Mechanismen zur Konfiguration eines Webclients über Umgebungsvariablen (wie z. B. environment no_proxy/env no_proxy) kaum verändert haben, haben sich bei den verschiedenen Implementierungen zahlreiche Feinheiten herausgebildet. Ein Beispiel aus der Praxis zeigt, dass die irrtümliche Definition widersprüchlicher ",[16,1370,26],{},"- und ",[16,1373,542],{},"-Variablen zu stundenlanger Fehlersuche führte, da Ruby und Go diese Einstellungen unterschiedlich auswerten. Das Hervorheben dieser Unterschiede kann helfen, zukünftige Probleme in deinem Produktions-Stack zu vermeiden. Es wäre wünschenswert, dass Webclient-Maintainer das Verhalten standardisieren, um solche Probleme von vornherein auszuschließen.",[1376,1377,1378],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}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 pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}",{"title":71,"searchDepth":742,"depth":742,"links":1380},[1381,1384,1385,1389,1392,1393,1395],{"id":34,"depth":742,"text":35,"children":1382},[1383],{"id":122,"depth":838,"text":123},{"id":170,"depth":742,"text":171},{"id":264,"depth":742,"text":265,"children":1386},[1387,1388],{"id":433,"depth":838,"text":434},{"id":463,"depth":838,"text":464},{"id":877,"depth":742,"text":878,"children":1390},[1391],{"id":1221,"depth":838,"text":1222},{"id":1245,"depth":742,"text":1246},{"id":1306,"depth":742,"text":1394},"Standardisierung von no_proxy",{"id":1364,"depth":742,"text":1365},"engineering","2021-01-27","Erfahre, wie GitLab ein Problem gelöst hat, das durch die Unterschiede der\nVariablen, die nicht von allen Webclients unterstützt werden, entstanden\nist.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659507/Blog/Hero%20Images/AdobeStock_623844718.jpg",{},true,"/de-de/blog/we-need-to-talk-no-proxy",{"title":5,"description":1398,"ogTitle":5,"ogDescription":1398,"noIndex":1401,"ogImage":1402,"ogUrl":1407,"ogSiteName":1408,"ogType":1409,"canonicalUrls":1407},"https://about.gitlab.com/blog/we-need-to-talk-no-proxy","https://about.gitlab.com","article","we-need-to-talk-no-proxy","de-de/blog/we-need-to-talk-no-proxy",[1413,1414,1415,1416],"community","careers","user stories","startups","BlogPost","2024-10-09","JGamTIq7P_IbXJymD5lbG0WbP5rw2c7H8nZRxqCASlo",{"logo":1421,"freeTrial":1426,"sales":1431,"login":1436,"items":1441,"search":1769,"minimal":1803,"duo":1821,"switchNav":1830,"pricingDeployment":1841},{"config":1422},{"href":1423,"dataGaName":1424,"dataGaLocation":1425},"/de-de/","gitlab logo","header",{"text":1427,"config":1428},"Kostenlose Testversion anfordern",{"href":1429,"dataGaName":1430,"dataGaLocation":1425},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de&glm_content=default-saas-trial/","free trial",{"text":1432,"config":1433},"Demo anfordern",{"href":1434,"dataGaName":1435,"dataGaLocation":1425},"/de-de/sales/?contact-topic=request-demo","sales",{"text":1437,"config":1438},"Anmelden",{"href":1439,"dataGaName":1440,"dataGaLocation":1425},"https://gitlab.com/users/sign_in/","sign in",[1442,1471,1573,1578,1691,1747],{"text":1443,"config":1444,"menu":1446},"Plattform",{"dataNavLevelOne":1445},"platform",{"type":1447,"columns":1448},"cards",[1449,1455,1463],{"title":1443,"description":1450,"link":1451},"Die intelligente Orchestrierungsplattform für DevSecOps",{"text":1452,"config":1453},"Die Plattform erkunden",{"href":1454,"dataGaName":1445,"dataGaLocation":1425},"/de-de/platform/",{"title":1456,"description":1457,"link":1458},"GitLab Duo Agent Platform","Agentische KI für den gesamten Software-Lebenszyklus",{"text":1459,"config":1460},"Lerne GitLab Duo kennen",{"href":1461,"dataGaName":1462,"dataGaLocation":1425},"/de-de/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1464,"description":1465,"link":1466},"Warum GitLab?","Erfahre, warum sich Unternehmen für GitLab entscheiden",{"text":1467,"config":1468},"Mehr erfahren",{"href":1469,"dataGaName":1470,"dataGaLocation":1425},"/de-de/why-gitlab/","why gitlab",{"text":1472,"left":1404,"config":1473,"menu":1475},"Produkt",{"dataNavLevelOne":1474},"solutions",{"type":1476,"link":1477,"columns":1481,"feature":1552},"lists",{"text":1478,"config":1479},"Alle Lösungen anzeigen",{"href":1480,"dataGaName":1474,"dataGaLocation":1425},"/de-de/solutions/",[1482,1507,1530],{"title":1483,"description":1484,"link":1485,"items":1490},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":1486},{"icon":1487,"href":1488,"dataGaName":1489,"dataGaLocation":1425},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[1491,1495,1498,1503],{"text":1492,"config":1493},"CI/CD",{"href":1494,"dataGaLocation":1425,"dataGaName":1492},"/de-de/solutions/continuous-integration/",{"text":1456,"config":1496},{"href":1461,"dataGaLocation":1425,"dataGaName":1497},"gitlab duo agent platform - product menu",{"text":1499,"config":1500},"Quellcodeverwaltung",{"href":1501,"dataGaLocation":1425,"dataGaName":1502},"/de-de/solutions/source-code-management/","Source Code Management",{"text":1504,"config":1505},"Automatische Softwarebereitstellung",{"href":1488,"dataGaLocation":1425,"dataGaName":1506},"Automated software delivery",{"title":1508,"description":1509,"link":1510,"items":1515},"Sicherheit","Entwickle Code schneller ohne Abstriche bei der Sicherheit",{"config":1511},{"href":1512,"dataGaName":1513,"dataGaLocation":1425,"icon":1514},"/de-de/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1516,1520,1525],{"text":1517,"config":1518},"Anwendungssicherheitstests",{"href":1512,"dataGaName":1519,"dataGaLocation":1425},"Application security testing",{"text":1521,"config":1522},"Schutz der Software-Lieferkette",{"href":1523,"dataGaLocation":1425,"dataGaName":1524},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":1526,"config":1527},"Software-Compliance",{"href":1528,"dataGaName":1529,"dataGaLocation":1425},"/de-de/solutions/software-compliance/","software compliance",{"title":1531,"link":1532,"items":1537},"Messung",{"config":1533},{"icon":1534,"href":1535,"dataGaName":1536,"dataGaLocation":1425},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[1538,1542,1547],{"text":1539,"config":1540},"Sichtbarkeit und Messung",{"href":1535,"dataGaLocation":1425,"dataGaName":1541},"Visibility and Measurement",{"text":1543,"config":1544},"Wertstrommanagement",{"href":1545,"dataGaLocation":1425,"dataGaName":1546},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":1548,"config":1549},"Analysen und Einblicke",{"href":1550,"dataGaLocation":1425,"dataGaName":1551},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":1553,"type":1476,"items":1554},"GitLab für",[1555,1561,1567],{"text":1556,"config":1557},"Enterprise",{"icon":1558,"href":1559,"dataGaLocation":1425,"dataGaName":1560},"Building","/de-de/enterprise/","enterprise",{"text":1562,"config":1563},"Kleinunternehmen",{"icon":1564,"href":1565,"dataGaLocation":1425,"dataGaName":1566},"Work","/de-de/small-business/","small business",{"text":1568,"config":1569},"Öffentlicher Sektor",{"icon":1570,"href":1571,"dataGaLocation":1425,"dataGaName":1572},"Organization","/de-de/solutions/public-sector/","public sector",{"text":1574,"config":1575},"Preise",{"href":1576,"dataGaName":1577,"dataGaLocation":1425,"dataNavLevelOne":1577},"/de-de/pricing/","pricing",{"text":1579,"config":1580,"menu":1582},"Ressourcen",{"dataNavLevelOne":1581},"resources",{"type":1476,"link":1583,"columns":1587,"feature":1680},{"text":1584,"config":1585},"Alle Ressourcen anzeigen",{"href":1586,"dataGaName":1581,"dataGaLocation":1425},"/de-de/resources/",[1588,1621,1648],{"title":1589,"items":1590},"Erste Schritte",[1591,1596,1601,1606,1611,1616],{"text":1592,"config":1593},"Installieren",{"href":1594,"dataGaName":1595,"dataGaLocation":1425},"/de-de/install/","install",{"text":1597,"config":1598},"Kurzanleitungen",{"href":1599,"dataGaName":1600,"dataGaLocation":1425},"/de-de/get-started/","quick setup checklists",{"text":1602,"config":1603},"Lernen",{"href":1604,"dataGaLocation":1425,"dataGaName":1605},"https://university.gitlab.com/","learn",{"text":1607,"config":1608},"Produktdokumentation",{"href":1609,"dataGaName":1610,"dataGaLocation":1425},"https://docs.gitlab.com/","product documentation",{"text":1612,"config":1613},"Best-Practice-Videos",{"href":1614,"dataGaName":1615,"dataGaLocation":1425},"/de-de/getting-started-videos/","best practice videos",{"text":1617,"config":1618},"Integrationen",{"href":1619,"dataGaName":1620,"dataGaLocation":1425},"/de-de/integrations/","integrations",{"title":1622,"items":1623},"Entdecken",[1624,1629,1634,1639,1643],{"text":1625,"config":1626},"Kundenerfolge",{"href":1627,"dataGaName":1628,"dataGaLocation":1425},"/de-de/customers/","customer success stories",{"text":1630,"config":1631},"Blog",{"href":1632,"dataGaName":1633,"dataGaLocation":1425},"/de-de/blog/","blog",{"text":1635,"config":1636},"Demo-Hub",{"href":1637,"dataGaName":1638,"dataGaLocation":1425},"/de-de/demo-hub/","demo hub",{"text":1640,"config":1641},"The Source",{"href":1642,"dataGaName":1633,"dataGaLocation":1425},"/de-de/the-source/",{"text":1644,"config":1645},"Remote",{"href":1646,"dataGaName":1647,"dataGaLocation":1425},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1649,"items":1650},"Vernetzen",[1651,1656,1661,1665,1670,1675],{"text":1652,"config":1653},"GitLab-Services",{"href":1654,"dataGaName":1655,"dataGaLocation":1425},"/de-de/services/","services",{"text":1657,"config":1658},"Beitragen",{"href":1659,"dataGaName":1660,"dataGaLocation":1425},"https://contributors.gitlab.com","contribute",{"text":1662,"config":1663},"Community",{"href":1664,"dataGaName":1413,"dataGaLocation":1425},"/community/",{"text":1666,"config":1667},"Forum",{"href":1668,"dataGaName":1669,"dataGaLocation":1425},"https://forum.gitlab.com/","forum",{"text":1671,"config":1672},"Veranstaltungen",{"href":1673,"dataGaName":1674,"dataGaLocation":1425},"/events/","events",{"text":1676,"config":1677},"Partner",{"href":1678,"dataGaName":1679,"dataGaLocation":1425},"/de-de/partners/","partners",{"config":1681,"title":1684,"text":1685,"link":1686},{"background":1682,"textColor":1683},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Neues bei GitLab","Über die neuesten Funktionen und Verbesserungen auf dem Laufenden bleiben.",{"text":1687,"config":1688},"Aktuelle Nachrichten",{"href":1689,"dataGaName":1690,"dataGaLocation":1425},"/de-de/whats-new/","whats new",{"text":1692,"config":1693,"menu":1695},"Unternehmen",{"dataNavLevelOne":1694},"company",{"type":1476,"columns":1696},[1697],{"items":1698},[1699,1704,1710,1712,1717,1722,1727,1732,1737,1742],{"text":1700,"config":1701},"Über",{"href":1702,"dataGaName":1703,"dataGaLocation":1425},"/de-de/company/","about",{"text":1705,"config":1706,"footerGa":1709},"Karriere",{"href":1707,"dataGaName":1708,"dataGaLocation":1425},"/jobs/","jobs",{"dataGaName":1708},{"text":1671,"config":1711},{"href":1673,"dataGaName":1674,"dataGaLocation":1425},{"text":1713,"config":1714},"Geschäftsführung",{"href":1715,"dataGaName":1716,"dataGaLocation":1425},"/company/team/e-group/","leadership",{"text":1718,"config":1719},"Handbuch",{"href":1720,"dataGaName":1721,"dataGaLocation":1425},"https://handbook.gitlab.com/","handbook",{"text":1723,"config":1724},"Investor Relations",{"href":1725,"dataGaName":1726,"dataGaLocation":1425},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1728,"config":1729},"Trust Center",{"href":1730,"dataGaName":1731,"dataGaLocation":1425},"/de-de/security/","trust center",{"text":1733,"config":1734},"AI Transparency Center",{"href":1735,"dataGaName":1736,"dataGaLocation":1425},"/de-de/ai-transparency-center/","ai transparency center",{"text":1738,"config":1739},"Newsletter",{"href":1740,"dataGaName":1741,"dataGaLocation":1425},"/company/contact/#contact-forms","newsletter",{"text":1743,"config":1744},"Presse",{"href":1745,"dataGaName":1746,"dataGaLocation":1425},"/press/","press",{"text":1748,"config":1749,"menu":1750},"Kontakt",{"dataNavLevelOne":1694},{"type":1476,"columns":1751},[1752],{"items":1753},[1754,1759,1764],{"text":1755,"config":1756},"Vertrieb kontaktieren",{"href":1757,"dataGaName":1758,"dataGaLocation":1425},"/de-de/sales/","talk to sales",{"text":1760,"config":1761},"Support-Portal",{"href":1762,"dataGaName":1763,"dataGaLocation":1425},"https://support.gitlab.com/hc/en-us","support portal",{"text":1765,"config":1766},"Kundenportal",{"href":1767,"dataGaName":1768,"dataGaLocation":1425},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1770,"login":1771,"suggestions":1778},"Schließen",{"text":1772,"link":1773},"Um Repositorys und Projekte zu durchsuchen, melde dich an bei",{"text":1774,"config":1775},"gitlab.com",{"href":1439,"dataGaName":1776,"dataGaLocation":1777},"search login","search",{"text":1779,"default":1780},"Vorschläge",[1781,1783,1788,1790,1795,1800],{"text":1456,"config":1782},{"href":1461,"dataGaName":1456,"dataGaLocation":1777},{"text":1784,"config":1785},"Codevorschläge (KI)",{"href":1786,"dataGaName":1787,"dataGaLocation":1777},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1492,"config":1789},{"href":1494,"dataGaName":1492,"dataGaLocation":1777},{"text":1791,"config":1792},"GitLab auf AWS",{"href":1793,"dataGaName":1794,"dataGaLocation":1777},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":1796,"config":1797},"GitLab auf Google Cloud",{"href":1798,"dataGaName":1799,"dataGaLocation":1777},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1464,"config":1801},{"href":1469,"dataGaName":1802,"dataGaLocation":1777},"Why GitLab?",{"freeTrial":1804,"mobileIcon":1809,"desktopIcon":1814,"secondaryButton":1817},{"text":1805,"config":1806},"Kostenlos testen",{"href":1807,"dataGaName":1430,"dataGaLocation":1808},"https://gitlab.com/-/trials/new/","nav",{"altText":1810,"config":1811},"GitLab-Symbol",{"src":1812,"dataGaName":1813,"dataGaLocation":1808},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1810,"config":1815},{"src":1816,"dataGaName":1813,"dataGaLocation":1808},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1589,"config":1818},{"href":1819,"dataGaName":1820,"dataGaLocation":1808},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/get-started/","get started",{"freeTrial":1822,"mobileIcon":1826,"desktopIcon":1828},{"text":1823,"config":1824},"Mehr über GitLab Duo erfahren",{"href":1461,"dataGaName":1825,"dataGaLocation":1808},"gitlab duo",{"altText":1810,"config":1827},{"src":1812,"dataGaName":1813,"dataGaLocation":1808},{"altText":1810,"config":1829},{"src":1816,"dataGaName":1813,"dataGaLocation":1808},{"button":1831,"mobileIcon":1836,"desktopIcon":1838},{"text":1832,"config":1833},"/Option",{"href":1834,"dataGaName":1835,"dataGaLocation":1808},"#contact","switch",{"altText":1810,"config":1837},{"src":1812,"dataGaName":1813,"dataGaLocation":1808},{"altText":1810,"config":1839},{"src":1840,"dataGaName":1813,"dataGaLocation":1808},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1842,"mobileIcon":1847,"desktopIcon":1849},{"text":1843,"config":1844},"Zurück zur Preisübersicht",{"href":1576,"dataGaName":1845,"dataGaLocation":1808,"icon":1846},"back to pricing","GoBack",{"altText":1810,"config":1848},{"src":1812,"dataGaName":1813,"dataGaLocation":1808},{"altText":1810,"config":1850},{"src":1816,"dataGaName":1813,"dataGaLocation":1808},{"title":1852,"button":1853,"config":1857},"GitLab Orbit ist da: die Kontextebene für KI-Agenten",{"text":1467,"config":1854},{"href":1855,"dataGaName":1856,"dataGaLocation":1425},"/de-de/gitlab-orbit/","orbit",{"layout":1858,"disabled":1401},"release",{"data":1860},{"text":1861,"source":1862,"edit":1868,"contribute":1873,"config":1878,"items":1883,"minimal":2089},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":1863,"config":1864},"Quelltext der Seite anzeigen",{"href":1865,"dataGaName":1866,"dataGaLocation":1867},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1869,"config":1870},"Diese Seite bearbeiten",{"href":1871,"dataGaName":1872,"dataGaLocation":1867},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1874,"config":1875},"Beteilige dich",{"href":1876,"dataGaName":1877,"dataGaLocation":1867},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1879,"facebook":1880,"youtube":1881,"linkedin":1882},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1884,1929,1982,2024,2056],{"title":1574,"links":1885,"subMenu":1900},[1886,1890,1895],{"text":1887,"config":1888},"Tarife anzeigen",{"href":1576,"dataGaName":1889,"dataGaLocation":1867},"view plans",{"text":1891,"config":1892},"Vorteile von Premium",{"href":1893,"dataGaName":1894,"dataGaLocation":1867},"/de-de/pricing/premium/","why premium",{"text":1896,"config":1897},"Vorteile von Ultimate",{"href":1898,"dataGaName":1899,"dataGaLocation":1867},"/de-de/pricing/ultimate/","why ultimate",[1901],{"title":1748,"links":1902},[1903,1905,1907,1909,1914,1919,1924],{"text":1755,"config":1904},{"href":1757,"dataGaName":1435,"dataGaLocation":1867},{"text":1760,"config":1906},{"href":1762,"dataGaName":1763,"dataGaLocation":1867},{"text":1765,"config":1908},{"href":1767,"dataGaName":1768,"dataGaLocation":1867},{"text":1910,"config":1911},"Status",{"href":1912,"dataGaName":1913,"dataGaLocation":1867},"https://status.gitlab.com/","status",{"text":1915,"config":1916},"Nutzungsbedingungen",{"href":1917,"dataGaName":1918,"dataGaLocation":1867},"/terms/","terms of use",{"text":1920,"config":1921},"Datenschutzerklärung",{"href":1922,"dataGaName":1923,"dataGaLocation":1867},"/de-de/privacy/","privacy statement",{"text":1925,"config":1926},"Cookie-Einstellungen",{"dataGaName":1927,"dataGaLocation":1867,"id":1928,"isOneTrustButton":1404},"cookie preferences","ot-sdk-btn",{"title":1472,"links":1930,"subMenu":1939},[1931,1935],{"text":1932,"config":1933},"DevSecOps-Plattform",{"href":1454,"dataGaName":1934,"dataGaLocation":1867},"devsecops platform",{"text":1936,"config":1937},"KI-unterstützte Entwicklung",{"href":1461,"dataGaName":1938,"dataGaLocation":1867},"ai-assisted development",[1940],{"title":1941,"links":1942},"Themen",[1943,1947,1952,1957,1962,1967,1972,1977],{"text":1492,"config":1944},{"href":1945,"dataGaName":1946,"dataGaLocation":1867},"/de-de/topics/ci-cd/","cicd",{"text":1948,"config":1949},"GitOps",{"href":1950,"dataGaName":1951,"dataGaLocation":1867},"/de-de/topics/gitops/","gitops",{"text":1953,"config":1954},"DevOps",{"href":1955,"dataGaName":1956,"dataGaLocation":1867},"/de-de/topics/devops/","devops",{"text":1958,"config":1959},"Versionskontrolle",{"href":1960,"dataGaName":1961,"dataGaLocation":1867},"/de-de/topics/version-control/","version control",{"text":1963,"config":1964},"DevSecOps",{"href":1965,"dataGaName":1966,"dataGaLocation":1867},"/de-de/topics/devsecops/","devsecops",{"text":1968,"config":1969},"Cloud-nativ",{"href":1970,"dataGaName":1971,"dataGaLocation":1867},"/de-de/topics/cloud-native/","cloud native",{"text":1973,"config":1974},"KI für das Programmieren",{"href":1975,"dataGaName":1976,"dataGaLocation":1867},"/de-de/topics/devops/ai-for-coding/","ai for coding",{"text":1978,"config":1979},"Agentische KI",{"href":1980,"dataGaName":1981,"dataGaLocation":1867},"/de-de/topics/agentic-ai/","agentic ai",{"title":1983,"links":1984},"Lösungen",[1985,1988,1990,1995,1999,2002,2005,2008,2010,2012,2014,2019],{"text":1517,"config":1986},{"href":1512,"dataGaName":1987,"dataGaLocation":1867},"Application Security Testing",{"text":1504,"config":1989},{"href":1488,"dataGaName":1489,"dataGaLocation":1867},{"text":1991,"config":1992},"Agile Entwicklung",{"href":1993,"dataGaName":1994,"dataGaLocation":1867},"/de-de/solutions/agile-delivery/","agile delivery",{"text":1996,"config":1997},"SCM",{"href":1501,"dataGaName":1998,"dataGaLocation":1867},"source code management",{"text":1492,"config":2000},{"href":1494,"dataGaName":2001,"dataGaLocation":1867},"continuous integration & delivery",{"text":1543,"config":2003},{"href":1545,"dataGaName":2004,"dataGaLocation":1867},"value stream management",{"text":1948,"config":2006},{"href":2007,"dataGaName":1951,"dataGaLocation":1867},"/de-de/solutions/gitops/",{"text":1556,"config":2009},{"href":1559,"dataGaName":1560,"dataGaLocation":1867},{"text":1562,"config":2011},{"href":1565,"dataGaName":1566,"dataGaLocation":1867},{"text":1568,"config":2013},{"href":1571,"dataGaName":1572,"dataGaLocation":1867},{"text":2015,"config":2016},"Bildungswesen",{"href":2017,"dataGaName":2018,"dataGaLocation":1867},"/de-de/solutions/education/","education",{"text":2020,"config":2021},"Finanzdienstleistungen",{"href":2022,"dataGaName":2023,"dataGaLocation":1867},"/de-de/solutions/finance/","financial services",{"title":1579,"links":2025},[2026,2028,2030,2032,2035,2037,2040,2042,2044,2046,2048,2050,2052,2054],{"text":1592,"config":2027},{"href":1594,"dataGaName":1595,"dataGaLocation":1867},{"text":1597,"config":2029},{"href":1599,"dataGaName":1600,"dataGaLocation":1867},{"text":1602,"config":2031},{"href":1604,"dataGaName":1605,"dataGaLocation":1867},{"text":1607,"config":2033},{"href":1609,"dataGaName":2034,"dataGaLocation":1867},"docs",{"text":1630,"config":2036},{"href":1632,"dataGaName":1633,"dataGaLocation":1867},{"text":2038,"config":2039},"Neuerungen",{"href":1689,"dataGaName":1690,"dataGaLocation":1867},{"text":1625,"config":2041},{"href":1627,"dataGaName":1628,"dataGaLocation":1867},{"text":1644,"config":2043},{"href":1646,"dataGaName":1647,"dataGaLocation":1867},{"text":1652,"config":2045},{"href":1654,"dataGaName":1655,"dataGaLocation":1867},{"text":1657,"config":2047},{"href":1659,"dataGaName":1660,"dataGaLocation":1867},{"text":1662,"config":2049},{"href":1664,"dataGaName":1413,"dataGaLocation":1867},{"text":1666,"config":2051},{"href":1668,"dataGaName":1669,"dataGaLocation":1867},{"text":1671,"config":2053},{"href":1673,"dataGaName":1674,"dataGaLocation":1867},{"text":1676,"config":2055},{"href":1678,"dataGaName":1679,"dataGaLocation":1867},{"title":1692,"links":2057},[2058,2060,2062,2064,2066,2068,2073,2078,2080,2082,2084],{"text":1700,"config":2059},{"href":1702,"dataGaName":1694,"dataGaLocation":1867},{"text":1705,"config":2061},{"href":1707,"dataGaName":1708,"dataGaLocation":1867},{"text":1713,"config":2063},{"href":1715,"dataGaName":1716,"dataGaLocation":1867},{"text":1718,"config":2065},{"href":1720,"dataGaName":1721,"dataGaLocation":1867},{"text":1723,"config":2067},{"href":1725,"dataGaName":1726,"dataGaLocation":1867},{"text":2069,"config":2070},"Nachhaltigkeit",{"href":2071,"dataGaName":2072,"dataGaLocation":1867},"/sustainability/","Sustainability",{"text":2074,"config":2075},"Vielfalt, Inklusion und Zugehörigkeit",{"href":2076,"dataGaName":2077,"dataGaLocation":1867},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1728,"config":2079},{"href":1730,"dataGaName":1731,"dataGaLocation":1867},{"text":1738,"config":2081},{"href":1740,"dataGaName":1741,"dataGaLocation":1867},{"text":1743,"config":2083},{"href":1745,"dataGaName":1746,"dataGaLocation":1867},{"text":2085,"config":2086},"Transparenzerklärung zu moderner Sklaverei",{"href":2087,"dataGaName":2088,"dataGaLocation":1867},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2090},[2091,2094,2097],{"text":2092,"config":2093},"Terms",{"href":1917,"dataGaName":1918,"dataGaLocation":1867},{"text":2095,"config":2096},"Cookies",{"dataGaName":1927,"dataGaLocation":1867,"id":1928,"isOneTrustButton":1404},{"text":2098,"config":2099},"Datenschutz",{"href":1922,"dataGaName":1923,"dataGaLocation":1867},[2101],{"id":2102,"title":7,"body":1400,"config":2103,"content":2105,"description":1400,"extension":2109,"meta":2110,"navigation":1404,"path":2111,"seo":2112,"stem":2113,"__hash__":2114},"blogAuthors/en-us/blog/authors/stan-hu.yml",{"template":2104},"BlogAuthor",{"name":7,"config":2106},{"headshot":2107,"ctfId":2108},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659504/Blog/Author%20Headshots/stanhu-headshot.jpg","stanhu","yml",{},"/en-us/blog/authors/stan-hu",{},"en-us/blog/authors/stan-hu","KmQVCb_7YcWghHApaS2EI3J2bQ0dRustgOz4wYyOnVk",[2116,2125,2133],{"title":2117,"description":2118,"heroImage":2119,"category":1396,"date":2120,"authors":2121,"slug":2124,"externalUrl":1400},"Confidential AI für GitLab Self-Hosted","KI-Coding-Agenten in GitLab Duo nutzen, ohne dass Quellcode eine hardwareverschlüsselte Grenze verlässt, und ohne eigene GPUs zu betreiben.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-08-06",[2122,2123],"Mathias Ewald","Martin Paloncy","confidential-ai-for-gitlab-self-hosted",{"title":2126,"description":2127,"heroImage":2128,"category":1396,"date":2129,"authors":2130,"slug":2132,"externalUrl":1400},"Green DevOps: Warum CO2-Messung in die CI/CD-Pipeline gehört","Jeder Pipeline-Lauf verbraucht Energie, die nirgends sichtbar wird. Eco CI und Carmen machen diesen CO2-Ausstoß sichtbar, direkt in den Pipelines.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-09",[2131],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":2134,"description":2135,"heroImage":2136,"category":1396,"date":2137,"authors":2138,"slug":2140,"externalUrl":1400},"Was ist CI/CD? Bedeutung, Vorteile und Tool-Auswahl","Was CI/CD bedeutet, welche Vorteile die Einführung bringt und worauf bei der Tool-Auswahl zu achten ist.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663328/Blog/Hero%20Images/cicd3.jpg","2026-06-22",[2139],"GitLab","what-is-ci-cd",{"promotions":2142},[2143,2157,2169,2181],{"id":2144,"categories":2145,"header":2147,"text":2148,"button":2149,"image":2154},"ai-modernization",[2146],"ai","Hält KI, was uns versprochen wurde?","Das Quiz dauert maximal 5 Minuten.",{"text":2150,"config":2151},"Ermittle deinen KI-Reifegrad",{"href":2152,"dataGaName":2153,"dataGaLocation":1633},"/de-de/assessments/ai-modernization-assessment/","modernization assessment",{"config":2155},{"src":2156},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2158,"categories":2159,"header":2161,"text":2148,"button":2162,"image":2166},"devops-modernization",[2160,1966],"product","Verwaltest du Tool-Chaos oder stellst du Innovationen bereit?",{"text":2163,"config":2164},"Ermittle deinen DevOps-Reifegrad",{"href":2165,"dataGaName":2153,"dataGaLocation":1633},"/de-de/assessments/devops-modernization-assessment/",{"config":2167},{"src":2168},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2170,"categories":2171,"header":2173,"text":2148,"button":2174,"image":2178},"security-modernization",[2172],"security","Tauschst du Schnelligkeit gegen Sicherheit ein?",{"text":2175,"config":2176},"Ermittle deinen Sicherheitsreifegrad",{"href":2177,"dataGaName":2153,"dataGaLocation":1633},"/de-de/assessments/security-modernization-assessment/",{"config":2179},{"src":2180},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2182,"paths":2183,"header":2186,"text":2187,"button":2188,"image":2193},"github-azure-migration",[2184,2185],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Ist dein Team bereit für den Umzug von GitHub nach Azure?","GitHub stellt bereits auf Azure um. Finde heraus, was das für dich bedeutet.",{"text":2189,"config":2190},"Erfahre, wie GitLab im Vergleich zu GitHub abschneidet",{"href":2191,"dataGaName":2192,"dataGaLocation":1633},"/de-de/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2194},{"src":2168},{"header":2196,"blurb":2197,"button":2198,"secondaryButton":2203},"Beginne noch heute, schneller zu entwickeln","Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.\n",{"text":2199,"config":2200},"Kostenlosen Test starten",{"href":2201,"dataGaName":1430,"dataGaLocation":2202},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/de-de/","feature",{"text":1755,"config":2204},{"href":1757,"dataGaName":1435,"dataGaLocation":2202},1786803738031]