[{"data":1,"prerenderedAt":1428},["ShallowReactive",2],{"blog-current-wie-man-verschiedene-dns-server-fuer-bestimter-domaens-verwendet-de":3,"blog-previous-wie-man-verschiedene-dns-server-fuer-bestimter-domaens-verwendet-de":596,"blog-next-wie-man-verschiedene-dns-server-fuer-bestimter-domaens-verwendet-de":610,"blog-alt-de-wie-man-verschiedene-dns-server-fuer-bestimter-domaens-verwendet-de":626,"blog-alt-en-wie-man-verschiedene-dns-server-fuer-bestimter-domaens-verwendet-de":627,"employee-bernd-helm":629,"related-refs-devops--de":734,"content-query-ChH556dtBR":761,"content-query-YkijYFcsFd":1317,"content-query-1PFeYVQSzn":1392},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"author":10,"image":11,"releaseDate":12,"blogCategories":13,"articleTags":16,"tags":19,"body":21,"_type":590,"_id":591,"_source":592,"_file":593,"_stem":594,"_extension":595},"/blog/wie-man-verschiedene-dns-server-fuer-bestimter-domaens-verwendet","blog",false,"","Wie man verschiedene DNS-Server für die Namensauflösung bestimmter Domänen verwendet - VPN Use-Case","Wie man ausgewählte Domains über VPN unter Linux auflöst. In der heutigen Welt nutzen mehr Menschen als je zuvor VPN-Dienste, um aus der Ferne zu arbeiten. In manchen Fällen ist es jedoch nicht wünschenswert, den gesamten Datenverkehr und alle Domainnamenauflösungen über die VPN-Verbindung zu leiten.","bernd-helm","/blog/thumbnails/VPN.png","2022-04-21",[14,15],"Das bewegt uns","DevOps",[17,18],"VPN","Linux",[20],"devops",{"type":22,"children":23,"toc":585},"root",[24,33,39,44,66,79,85,114,132,138,143,156,169,202,229,250,307,323,350,393,422,472,491,504,547,559,579],{"type":25,"tag":26,"props":27,"children":29},"element","h2",{"id":28},"wie-man-ausgewählte-domains-über-vpn-unter-linux-auflöst",[30],{"type":31,"value":32},"text","Wie man ausgewählte Domains über VPN unter Linux auflöst",{"type":25,"tag":34,"props":35,"children":36},"p",{},[37],{"type":31,"value":38},"In der heutigen Welt nutzen mehr Menschen als je zuvor VPN-Dienste, um aus der Ferne zu arbeiten. In manchen Fällen ist\nes jedoch nicht wünschenswert, den gesamten Datenverkehr und alle Domainnamenauflösungen über die VPN-Verbindung zu\nleiten. Selbst wenn der VPN-Server möchte, dass der Client genau so\nkonfiguriert werden soll, kann der Client so konfiguriert werden, dass er die Anforderung, den gesamten Datenverkehr\nüber die VPN-Verbindung zu leiten, ignoriert.",{"type":25,"tag":34,"props":40,"children":41},{},[42],{"type":31,"value":43},"Zum Beispiel kann bei Openvpn die Option",{"type":25,"tag":45,"props":46,"children":50},"pre",{"className":47,"code":48,"language":49,"meta":7,"style":7},"language-apache shiki shiki-themes github-dark github-dark monokai","pull-filter ignore redirect-gateway\n","apache",[51],{"type":25,"tag":52,"props":53,"children":54},"code",{"__ignoreMap":7},[55],{"type":25,"tag":56,"props":57,"children":60},"span",{"class":58,"line":59},"line",1,[61],{"type":25,"tag":56,"props":62,"children":64},{"style":63},"--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2",[65],{"type":31,"value":48},{"type":25,"tag":34,"props":67,"children":68},{},[69,71,77],{"type":31,"value":70},"verwendet werden, um den ",{"type":25,"tag":52,"props":72,"children":74},{"className":73},[],[75],{"type":31,"value":76},"openvpn-client",{"type":31,"value":78}," anzuweisen, alle \"route all\"-Anfragen des Servers zu ignorieren.",{"type":25,"tag":26,"props":80,"children":82},{"id":81},"fritzbox-beispiel",[83],{"type":31,"value":84},"FRITZ!Box Beispiel",{"type":25,"tag":34,"props":86,"children":87},{},[88,90,96,98,104,106,112],{"type":31,"value":89},"Kürzlich musste ich eine VPN-Verbindung zu einer ",{"type":25,"tag":91,"props":92,"children":93},"strong",{},[94],{"type":31,"value":95},"FRITZ!Box",{"type":31,"value":97}," nutzen. Das ist ein sehr beliebter Router in Deutschland,\nder nicht nur\neinfache\nVPN-Verbindungen anbietet, sondern auch alle Hosts in seinem Netzwerk zu seinem eigenen DNS hinzufügt. Wenn Sie mit\neinem Rechner mit dem Namen ",{"type":25,"tag":52,"props":99,"children":101},{"className":100},[],[102],{"type":31,"value":103}," workstation",{"type":31,"value":105}," ansprechen wollen, können Sie ihn über den dns-Namen \"workstation.fritz.box\" erreichen. Die fritz-box\nselbst ist auch unter dem\ndns-Namen ",{"type":25,"tag":52,"props":107,"children":109},{"className":108},[],[110],{"type":31,"value":111},"fritz.box",{"type":31,"value":113},".",{"type":25,"tag":34,"props":115,"children":116},{},[117,119,124,126,130],{"type":31,"value":118},"In meinem Fall ziehe ich es aus Geschwindigkeits- und Datenschutzgründen vor, meinen eigenen DNS-Server für alle\nAbfragen zu verwenden - das heißt, ich möchte nur\ndie Domains mit dem Suffix ",{"type":25,"tag":52,"props":120,"children":122},{"className":121},[],[123],{"type":31,"value":111},{"type":31,"value":125}," über die ",{"type":25,"tag":91,"props":127,"children":128},{},[129],{"type":31,"value":95},{"type":31,"value":131}," auflösen.",{"type":25,"tag":26,"props":133,"children":135},{"id":134},"lösung-mit-einem-lokalen-dns-server-dnsmasq",[136],{"type":31,"value":137},"Lösung mit einem lokalen DNS-Server - dnsmasq",{"type":25,"tag":34,"props":139,"children":140},{},[141],{"type":31,"value":142},"Dnsmasq ist ein leichtgewichtiger DNS-Server, den man auf dem eigenen Rechner laufen lassen kann, um die Kontrolle über\ndie Namensauflösung zu bekommen. Ein netter Nebeneffekt ist, dass er seinen eigenen DNS-Cache hat, was wiederkehrende\nDNS-Abfragen schneller macht. Hier ist, wie ich ihn eingerichtet habe:",{"type":25,"tag":34,"props":144,"children":145},{},[146,148,154],{"type":31,"value":147},"Bevor Sie beginnen, müssen Sie herausfinden, welcher DNS-Server im VPN verwendet wird. Normalerweise ist es das\nStandard-Gateway, das normalerweise\nein ",{"type":25,"tag":52,"props":149,"children":151},{"className":150},[],[152],{"type":31,"value":153},".1",{"type":31,"value":155}," am Ende hat. Sie können die VPN-Protokolle genau beobachten, um herauszufinden, welcher DNS-Server bei der\nVerbindung verwendet wird.",{"type":25,"tag":34,"props":157,"children":158},{},[159,161,167],{"type":31,"value":160},"Es gibt ein Tool namens ",{"type":25,"tag":52,"props":162,"children":164},{"className":163},[],[165],{"type":31,"value":166},"dig",{"type":31,"value":168},", das DNS-Abfragen über bestimmte DNS-Server durchführen kann, zum Beispiel",{"type":25,"tag":45,"props":170,"children":174},{"className":171,"code":172,"language":173,"meta":7,"style":7},"language-bash shiki shiki-themes github-dark github-dark monokai","dig @192.168.1.1 a fritz.box\n\n","bash",[175],{"type":25,"tag":52,"props":176,"children":177},{"__ignoreMap":7},[178],{"type":25,"tag":56,"props":179,"children":180},{"class":58,"line":59},[181,186,192,197],{"type":25,"tag":56,"props":182,"children":184},{"style":183},"--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E",[185],{"type":31,"value":166},{"type":25,"tag":56,"props":187,"children":189},{"style":188},"--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74",[190],{"type":31,"value":191}," @192.168.1.1",{"type":25,"tag":56,"props":193,"children":194},{"style":188},[195],{"type":31,"value":196}," a",{"type":25,"tag":56,"props":198,"children":199},{"style":188},[200],{"type":31,"value":201}," fritz.box\n",{"type":25,"tag":34,"props":203,"children":204},{},[205,207,213,215,220,222,228],{"type":31,"value":206},"wird den DNS-Server ",{"type":25,"tag":52,"props":208,"children":210},{"className":209},[],[211],{"type":31,"value":212},"192.168.1.1",{"type":31,"value":214}," nach der IP von ",{"type":25,"tag":52,"props":216,"children":218},{"className":217},[],[219],{"type":31,"value":111},{"type":31,"value":221}," fragen. Dig ist sehr praktisch bei der Fehlersuche bei DNS-Problemen und Ihrer Einrichtung zu testen.  Sie müssen es eventuell auf Ihrem System installieren. Unter Debian befindet es sich in einem Paket namens ",{"type":25,"tag":52,"props":223,"children":225},{"className":224},[],[226],{"type":31,"value":227},"dnsutils",{"type":31,"value":113},{"type":25,"tag":34,"props":230,"children":231},{},[232,234,240,242,248],{"type":31,"value":233},"Installieren Sie zuerst ",{"type":25,"tag":52,"props":235,"children":237},{"className":236},[],[238],{"type":31,"value":239},"dnsmasq",{"type":31,"value":241}," auf Ihrem Linux und bearbeiten Sie seine Konfiguration (normalerweise in ",{"type":25,"tag":52,"props":243,"children":245},{"className":244},[],[246],{"type":31,"value":247},"/etc/dnsmasq.conf",{"type":31,"value":249},"). Fügen Sie diese Zeilen\nhier ein:",{"type":25,"tag":45,"props":251,"children":253},{"className":47,"code":252,"language":49,"meta":7,"style":7},"resolv-datei=/etc/resolv.dnsmasq.conf\nserver=/fritz.box/192.168.1.1\n",[254],{"type":25,"tag":52,"props":255,"children":256},{"__ignoreMap":7},[257,265],{"type":25,"tag":56,"props":258,"children":259},{"class":58,"line":59},[260],{"type":25,"tag":56,"props":261,"children":262},{"style":63},[263],{"type":31,"value":264},"resolv-datei=/etc/resolv.dnsmasq.conf\n",{"type":25,"tag":56,"props":266,"children":268},{"class":58,"line":267},2,[269,274,280,284,289,293,298,302],{"type":25,"tag":56,"props":270,"children":271},{"style":63},[272],{"type":31,"value":273},"server=/fritz.box/",{"type":25,"tag":56,"props":275,"children":277},{"style":276},"--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF",[278],{"type":31,"value":279},"192",{"type":25,"tag":56,"props":281,"children":282},{"style":63},[283],{"type":31,"value":113},{"type":25,"tag":56,"props":285,"children":286},{"style":276},[287],{"type":31,"value":288},"168",{"type":25,"tag":56,"props":290,"children":291},{"style":63},[292],{"type":31,"value":113},{"type":25,"tag":56,"props":294,"children":295},{"style":276},[296],{"type":31,"value":297},"1",{"type":25,"tag":56,"props":299,"children":300},{"style":63},[301],{"type":31,"value":113},{"type":25,"tag":56,"props":303,"children":304},{"style":276},[305],{"type":31,"value":306},"1\n",{"type":25,"tag":34,"props":308,"children":309},{},[310,315,317,322],{"type":25,"tag":52,"props":311,"children":313},{"className":312},[],[314],{"type":31,"value":111},{"type":31,"value":316}," ist die Domain, die über den VPN-Dnsserver aufgelöst werden soll, in diesem Beispiel ",{"type":25,"tag":52,"props":318,"children":320},{"className":319},[],[321],{"type":31,"value":212},{"type":31,"value":113},{"type":25,"tag":34,"props":324,"children":325},{},[326,328,333,335,340,342,348],{"type":31,"value":327},"Die ",{"type":25,"tag":91,"props":329,"children":330},{},[331],{"type":31,"value":332},"Resolv-Datei",{"type":31,"value":334}," wird ",{"type":25,"tag":52,"props":336,"children":338},{"className":337},[],[339],{"type":31,"value":239},{"type":31,"value":341}," mitteilen, wie es seine DNS-Anfragen auflösen soll, falls es keine anderen Regeln\ngibt, also erstellen wir ",{"type":25,"tag":52,"props":343,"children":345},{"className":344},[],[346],{"type":31,"value":347},"/etc/resolv.dnsmasq.conf",{"type":31,"value":349},"\nmit dem Inhalt",{"type":25,"tag":45,"props":351,"children":353},{"className":47,"code":352,"language":49,"meta":7,"style":7},"Nameserver 1.1.1.1\n",[354],{"type":25,"tag":52,"props":355,"children":356},{"__ignoreMap":7},[357],{"type":25,"tag":56,"props":358,"children":359},{"class":58,"line":59},[360,365,369,373,377,381,385,389],{"type":25,"tag":56,"props":361,"children":362},{"style":63},[363],{"type":31,"value":364},"Nameserver ",{"type":25,"tag":56,"props":366,"children":367},{"style":276},[368],{"type":31,"value":297},{"type":25,"tag":56,"props":370,"children":371},{"style":63},[372],{"type":31,"value":113},{"type":25,"tag":56,"props":374,"children":375},{"style":276},[376],{"type":31,"value":297},{"type":25,"tag":56,"props":378,"children":379},{"style":63},[380],{"type":31,"value":113},{"type":25,"tag":56,"props":382,"children":383},{"style":276},[384],{"type":31,"value":297},{"type":25,"tag":56,"props":386,"children":387},{"style":63},[388],{"type":31,"value":113},{"type":25,"tag":56,"props":390,"children":391},{"style":276},[392],{"type":31,"value":306},{"type":25,"tag":34,"props":394,"children":395},{},[396,398,404,406,412,414,420],{"type":31,"value":397},"Wenn Sie eine statische Netzwerkkonfiguration verwenden, können Sie diese jetzt einfach bearbeiten, um ",{"type":25,"tag":52,"props":399,"children":401},{"className":400},[],[402],{"type":31,"value":403},"127.0.0.1",{"type":31,"value":405}," als\nNameserver zu verwenden. Wenn Sie\nautomatische IP-Konfiguration mit dhcp verwenden, müssen Sie Ihren dhcp-Client so konfigurieren, dass er den neuen\nlokalen DNS-Server verwendet. Unter Debian,\nist der Standard ",{"type":25,"tag":52,"props":407,"children":409},{"className":408},[],[410],{"type":31,"value":411},"dhclient",{"type":31,"value":413},". In diesem Fall editieren Sie ",{"type":25,"tag":52,"props":415,"children":417},{"className":416},[],[418],{"type":31,"value":419},"/etc/dhcp/dhclient.conf",{"type":31,"value":421}," und fügen hinzu:",{"type":25,"tag":45,"props":423,"children":425},{"className":47,"code":424,"language":49,"meta":7,"style":7},"domain-name-servers 127.0.0.1 vorangestellt;\n\n",[426],{"type":25,"tag":52,"props":427,"children":428},{"__ignoreMap":7},[429],{"type":25,"tag":56,"props":430,"children":431},{"class":58,"line":59},[432,437,442,446,451,455,459,463,467],{"type":25,"tag":56,"props":433,"children":434},{"style":63},[435],{"type":31,"value":436},"domain-name-servers ",{"type":25,"tag":56,"props":438,"children":439},{"style":276},[440],{"type":31,"value":441},"127",{"type":25,"tag":56,"props":443,"children":444},{"style":63},[445],{"type":31,"value":113},{"type":25,"tag":56,"props":447,"children":448},{"style":276},[449],{"type":31,"value":450},"0",{"type":25,"tag":56,"props":452,"children":453},{"style":63},[454],{"type":31,"value":113},{"type":25,"tag":56,"props":456,"children":457},{"style":276},[458],{"type":31,"value":450},{"type":25,"tag":56,"props":460,"children":461},{"style":63},[462],{"type":31,"value":113},{"type":25,"tag":56,"props":464,"children":465},{"style":276},[466],{"type":31,"value":297},{"type":25,"tag":56,"props":468,"children":469},{"style":63},[470],{"type":31,"value":471}," vorangestellt;\n",{"type":25,"tag":34,"props":473,"children":474},{},[475,477,482,484,489],{"type":31,"value":476},"Das war's. Alles, was Sie jetzt noch tun müssen, ist ",{"type":25,"tag":52,"props":478,"children":480},{"className":479},[],[481],{"type":31,"value":239},{"type":31,"value":483}," neu zu starten, damit es seine Konfiguration neu lädt und ",{"type":25,"tag":52,"props":485,"children":487},{"className":486},[],[488],{"type":31,"value":411},{"type":31,"value":490}," neu zu verbinden/starten\n(das Trennen und erneute Verbinden des Netzwerks kann funktionieren, im Zweifelsfall starten Sie den Rechner neu).",{"type":25,"tag":34,"props":492,"children":493},{},[494,496,502],{"type":31,"value":495},"Jetzt können Sie überprüfen, ob die Datei ",{"type":25,"tag":52,"props":497,"children":499},{"className":498},[],[500],{"type":31,"value":501},"/etc/resolv.conf",{"type":31,"value":503}," folgendes enthält",{"type":25,"tag":45,"props":505,"children":507},{"className":47,"code":506,"language":49,"meta":7,"style":7},"nameserver 127.0.0.1\n",[508],{"type":25,"tag":52,"props":509,"children":510},{"__ignoreMap":7},[511],{"type":25,"tag":56,"props":512,"children":513},{"class":58,"line":59},[514,519,523,527,531,535,539,543],{"type":25,"tag":56,"props":515,"children":516},{"style":63},[517],{"type":31,"value":518},"nameserver ",{"type":25,"tag":56,"props":520,"children":521},{"style":276},[522],{"type":31,"value":441},{"type":25,"tag":56,"props":524,"children":525},{"style":63},[526],{"type":31,"value":113},{"type":25,"tag":56,"props":528,"children":529},{"style":276},[530],{"type":31,"value":450},{"type":25,"tag":56,"props":532,"children":533},{"style":63},[534],{"type":31,"value":113},{"type":25,"tag":56,"props":536,"children":537},{"style":276},[538],{"type":31,"value":450},{"type":25,"tag":56,"props":540,"children":541},{"style":63},[542],{"type":31,"value":113},{"type":25,"tag":56,"props":544,"children":545},{"style":276},[546],{"type":31,"value":306},{"type":25,"tag":34,"props":548,"children":549},{},[550,552,557],{"type":31,"value":551},"als ersten Nameserver enthält. Wenn dies der Fall ist, sollte die ausgewählte Domain (in meinem Beispiel ",{"type":25,"tag":52,"props":553,"children":555},{"className":554},[],[556],{"type":31,"value":111},{"type":31,"value":558},")\nnun aufgelöst werden.",{"type":25,"tag":34,"props":560,"children":561},{},[562,564,569,571,577],{"type":31,"value":563},"Bei ",{"type":25,"tag":52,"props":565,"children":567},{"className":566},[],[568],{"type":31,"value":239},{"type":31,"value":570}," können Sie mehrere ",{"type":25,"tag":52,"props":572,"children":574},{"className":573},[],[575],{"type":31,"value":576},"server=",{"type":31,"value":578},"-Zeilen hinzufügen, was praktisch ist, wenn Sie mehrere Domains haben, die\nüber verschiedene DNS-Server aufgelöst werden müssen.",{"type":25,"tag":580,"props":581,"children":582},"style",{},[583],{"type":31,"value":584},"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":267,"depth":267,"links":586},[587,588,589],{"id":28,"depth":267,"text":32},{"id":81,"depth":267,"text":84},{"id":134,"depth":267,"text":137},"markdown","common:blog:10.wie-man-verschiedene-dns-server-fuer-bestimter-domaens-verwendet.md","common","blog/10.wie-man-verschiedene-dns-server-fuer-bestimter-domaens-verwendet.md","blog/10.wie-man-verschiedene-dns-server-fuer-bestimter-domaens-verwendet","md",{"_path":597,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":598,"description":599,"author":10,"image":600,"releaseDate":601,"blogCategories":602,"articleTags":604,"tags":605,"_type":590,"_id":607,"_source":592,"_file":608,"_stem":609,"_extension":595},"/blog/shopware-5-parallele-miniaturbildererstellung","Shopware 5 - Parallele Hochgeschwindigkeits-Miniaturbildererstellung","Wie man den integrierten SW5-Mechanismus so abstimmt, dass er mehr als 22 Mal schneller arbeitet! Shopware 5 - Parallele Thumbnail-Generierung nach dem Umzug eines Shopware 5 Systems auf einen anderen Server Wir hatten einen Kunden mit 400k Bildern und 1600k Thumbnails, der von einem alten hdd-basierten Server auf einen neuen ssd-Server umziehen musste ...","/images/shopware.svg","2021-04-29",[603,15],"Shopware",[17],[606],"shopware","common:blog:9.shopware-5-parallele-miniaturbildererstellung.md","blog/9.shopware-5-parallele-miniaturbildererstellung.md","blog/9.shopware-5-parallele-miniaturbildererstellung",{"_path":611,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":612,"description":613,"author":10,"image":614,"releaseDate":615,"blogCategories":616,"articleTags":617,"tags":620,"_type":590,"_id":623,"_source":592,"_file":624,"_stem":625,"_extension":595},"/blog/amazon-mws-sp-api-wrapper-de","Amazon MWS zu SP API Wrapper","Wir haben einen Wrapper veröffentlicht, der Amazon MWS in SP API umwandelt, um Entwicklern mit veralteten Systemen eine einfache Lösung anzubieten. Dieses Open-Source-Projekt bietet eine praktische Alternative zur Neuentwicklung und unterstützt die Fortführung bestehender Anwendungen.","/blog/thumbnails/AWS.svg","2024-02-21",[14,15],[618,619],"Amazon","Open Source",[621,622],"e-commerce","backend","common:blog:11.amazon-mws-sp-api-wrapper-de.md","blog/11.amazon-mws-sp-api-wrapper-de.md","blog/11.amazon-mws-sp-api-wrapper-de",{"_path":4},{"_path":628},"/en/blog/how-to-use-different-dns-servers-on-specific-domains",{"_path":630,"_dir":631,"_draft":6,"_partial":6,"_locale":7,"slug":10,"teams":632,"primaryTeam":634,"firstName":635,"lastName":636,"prefixTitle":7,"suffixTitle":7,"education":637,"executiveRole":642,"role":643,"workingSince":651,"inTheCompanySince":652,"techSkills":653,"skills":698,"projects":711,"contactDetails":724,"_image":727,"image":728,"_id":729,"_type":730,"title":731,"_source":631,"_file":732,"_stem":733,"_extension":730},"/employees/bernd-helm","employees",[633,634],"ai","devOps","Bernd","Helm",[638],[639,640,641],"B. Sc. Angewandte Informatik","FHDW Dresden","2010","CTO",[644,645,634,646,647,648,649,650],"founder","chiefTechnologyOfficer","databaseSpecialist","admin","softwareDeveloper","backendDeveloper","consultant","2005","2008",[654,658,660,662,665,667,670,672,674,676,679,683,686,689,692,695],{"name":655,"level":656,"icon":657},"Docker","expert","/images/Docker.svg",{"name":18,"level":656,"icon":659},"/images/linux_os-mono.svg",{"name":661,"level":656},"Zabbix",{"name":663,"level":656,"icon":664},"MariaDB ColumnStore","/images/maria-db-logo.svg",{"name":666,"level":656},"OpenAI",{"name":668,"level":656,"icon":669},"Pytorch","/images/PyTorch.svg",{"name":671,"level":656},"PHP",{"name":673,"level":656},"Java",{"name":675,"level":656},"Python",{"name":677,"level":656,"icon":678},"SQL","/images/SQL.svg",{"name":680,"level":681,"icon":682},"C++","advanced","/images/cpp-logo.svg",{"name":684,"level":681,"icon":685},"C#","/images/csharp.svg",{"name":687,"level":681,"icon":688},"CSS","/images/css.svg",{"name":690,"level":681,"icon":691},"HTML","/images/html.svg",{"name":693,"level":681,"icon":694},"OpenCV","/images/OpenCV.svg",{"name":696,"level":681,"icon":697},"Vue.js","/images/vuejs.svg",[699,701,703,705,707,709],{"name":700,"level":656},"artificialIntelligence",{"name":702,"level":656},"codingGuidelines",{"name":704,"level":656},"databases",{"name":706,"level":656},"linuxServerAdministration",{"name":708,"level":656},"softwareArchitect",{"name":710,"level":681},"qualityAssurance",[712,715,717,719,722],{"project":713,"position":714},"Gridside","Technical Consultant",{"project":716,"position":714},"Herole",{"project":718,"position":714},"Montagespezis",{"project":720,"position":721},"Orsee","Technical Manager",{"project":723,"position":714},"Vipr",{"eMail":725,"phone":726,"visibility":297},"bernd.helm@helmundwalter.de","+49 351 799 035 20","images/employees/Portraits/bernd_helm.webp","images/employees/Portraits/BerndHelm_MS.webp","employees:employees:1.bernd-helm.json","json","Bernd Helm","employees/1.bernd-helm.json","employees/1.bernd-helm",[735,750],{"_path":736,"_dir":737,"_draft":6,"_partial":738,"_locale":7,"name":739,"slug":737,"text":740,"hoverText":741,"image":742,"customer":739,"tags":743,"_id":745,"_type":746,"title":747,"_source":592,"_file":748,"_stem":749,"_extension":746},"/portfolio/pixelx/_teaser","pixelx",true,"PixelX","IT-Sicherheit mit Augenmaß und Sachverstand","Für PixelX haben wir eine gezielte Sicherheitsanalyse durchgeführt, bei der wir dank unseres tiefen technischen Verständnisses eine kritische Schwachstelle identifizieren konnten. Mit minimalem Zeitaufwand erzielten wir maximalen Sicherheitsgewinn.","/images/portfolio/pixelx/pixelx_secured.png",[744,20],"security","common:portfolio:9010.pixelx:_teaser.yaml","yaml","Teaser","portfolio/9010.pixelx/_teaser.yaml","portfolio/9010.pixelx/_teaser",{"_path":751,"_dir":752,"_draft":6,"_partial":738,"_locale":7,"name":753,"slug":752,"text":754,"hoverText":755,"image":756,"customer":753,"tags":757,"_id":758,"_type":746,"title":747,"_source":592,"_file":759,"_stem":760,"_extension":746},"/portfolio/slimspots/_teaser","slimspots","SlimSpots","Große Datenmengen in Echtzeit verarbeiten","Für SlimSpots, einen weltweit agierenden Anbieter von Ad-Marketing-Lösungen, haben wir eine hochskalierbare Infrastruktur entwickelt, die die Verarbeitung von Billionen Datensätzen in Echtzeit ermöglicht.","/images/portfolio/slimspots/slim_spots_prtfolio.png",[704,20],"common:portfolio:9020.slimspots:_teaser.yaml","portfolio/9020.slimspots/_teaser.yaml","portfolio/9020.slimspots/_teaser",{"_path":597,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":598,"description":599,"author":10,"image":600,"releaseDate":601,"blogCategories":762,"articleTags":763,"tags":764,"body":765,"_type":590,"_id":607,"_source":592,"_file":608,"_stem":609,"_extension":595},[603,15],[17],[606],{"type":22,"children":766,"toc":1312},[767,773,778,790,824,830,835,854,863,868,873,1212,1217,1222,1227,1232,1244,1294,1302,1308],{"type":25,"tag":26,"props":768,"children":770},{"id":769},"shopware-5-parallele-thumbnail-generierung-nach-dem-verschieben-eines-shopware-5-systems-auf-einen-anderen-server",[771],{"type":31,"value":772},"Shopware 5 - Parallele Thumbnail-Generierung nach dem Verschieben eines Shopware 5-Systems auf einen anderen Server",{"type":25,"tag":34,"props":774,"children":775},{},[776],{"type":31,"value":777},"Wir hatten einen Kunden mit 400k Bildern und 1600k Thumbnails, der von einem alten hdd-basierten Server auf einen neuen ssd-basierten umziehen musste. Das Problem war, dass der alte Server so langsam war, dass er bereits 2 Tage brauchte, um alle Bilder durchzuzählen, ganz zu schweigen vom Kopieren der Bilder.",{"type":25,"tag":34,"props":779,"children":780},{},[781,783],{"type":31,"value":782},"Also haben wir beschlossen, nur die Originalbilder zu kopieren und die Thumbnails neu zu generieren. Um die Originalbilder zu kopieren, habe ich einen kleinen Konsolenbefehl erstellt, der alle Pfade der Originalbilder, die wir kopieren müssen, exportiert: ",{"type":25,"tag":784,"props":785,"children":787},"a",{"href":786},"https://gist.github.com/bhelm/2d30f0cebcf4a7d8ea41c532ec67cd62",[788],{"type":31,"value":789},"ExportImagesCommand.php",{"type":25,"tag":34,"props":791,"children":792},{},[793,795,801,803,808,810,815,817,822],{"type":31,"value":794},"Diese Dateiliste kann mit den Optionen ",{"type":25,"tag":796,"props":797,"children":798},"em",{},[799],{"type":31,"value":800},"tar -T",{"type":31,"value":802}," oder ",{"type":25,"tag":796,"props":804,"children":805},{},[806],{"type":31,"value":807},"rsync --files-from=",{"type":31,"value":809}," verwendet werden, die diese Tools anweisen, nur die aufgelisteten Dateien zu verarbeiten. Für den anfänglichen Kopiervorgang ist ",{"type":25,"tag":796,"props":811,"children":812},{},[813],{"type":31,"value":814},"tar",{"type":31,"value":816}," sehr zu empfehlen, da es nur die aufgelisteten Dateien abholt, ohne irgendeine \"Berechnung\" wie bei ",{"type":25,"tag":796,"props":818,"children":819},{},[820],{"type":31,"value":821},"rsync",{"type":31,"value":823}," vorzunehmen.",{"type":25,"tag":26,"props":825,"children":827},{"id":826},"sw5-standard-thumbnails-generieren-hätte-80-stunden-gedauert",[828],{"type":31,"value":829},"SW5 Standard-Thumbnails generieren hätte 80 Stunden gedauert",{"type":25,"tag":34,"props":831,"children":832},{},[833],{"type":31,"value":834},"... und würde nur die Hälfte eines Kerns nutzen.",{"type":25,"tag":34,"props":836,"children":837},{},[838,840,845,847,852],{"type":31,"value":839},"Ich war neugierig, ob ich diesen Generierungsprozess beschleunigen kann. Der Server selbst hat 32 Kerne zur Verfügung, also habe ich den Befehl ",{"type":25,"tag":796,"props":841,"children":842},{},[843],{"type":31,"value":844},"generate thumbnail",{"type":31,"value":846}," aus sw5 kopiert und ihn so modifiziert, dass er mit dem Parameter ",{"type":25,"tag":796,"props":848,"children":849},{},[850],{"type":31,"value":851},"--batch",{"type":31,"value":853}," in Batches arbeitet:",{"type":25,"tag":34,"props":855,"children":856},{},[857],{"type":25,"tag":784,"props":858,"children":860},{"href":859},"https://gist.github.com/bhelm/2015d3829d4a3f24f9760f6e4e1aac1f",[861],{"type":31,"value":862},"ParallelThumbnailGenerateCommand.php",{"type":25,"tag":34,"props":864,"children":865},{},[866],{"type":31,"value":867},"Damit es funktioniert, habe ich einfach den Shopware-Kern unter engine/Shopware/Models/Media/Repository.php geändert",{"type":25,"tag":34,"props":869,"children":870},{},[871],{"type":31,"value":872},"Ich habe einfach die getAlbumMediaQuery Funktion geändert in:",{"type":25,"tag":45,"props":874,"children":878},{"className":875,"code":876,"language":877,"meta":7,"style":7},"language-cpp shiki shiki-themes github-dark github-dark monokai","public function getAlbumMediaQuery($albumId, $filter = null, $orderBy = null, $offset = null, $limit = null, $validTypes = null, $batch = null)\n{\n$builder = $this->getAlbumMediaQueryBuilder($albumId, $filter, $orderBy, $validTypes);\nif (is_numeric($batch)) {\n$builder->andWhere('MOD(media.id, 1000) = ?3');\n$builder->setParameter(3, $batch);\n}\n\n    if ($limit !== null) {\n        $builder->setFirstResult($offset)\n                ->setMaxResults($limit);\n    }\n\n    return $builder->getQuery();\n}\n","cpp",[879],{"type":25,"tag":52,"props":880,"children":881},{"__ignoreMap":7},[882,956,964,1003,1027,1056,1083,1092,1101,1125,1144,1163,1172,1180,1204],{"type":25,"tag":56,"props":883,"children":884},{"class":58,"line":59},[885,890,895,900,906,911,915,920,924,929,933,938,942,947,951],{"type":25,"tag":56,"props":886,"children":887},{"style":63},[888],{"type":31,"value":889},"public function ",{"type":25,"tag":56,"props":891,"children":892},{"style":183},[893],{"type":31,"value":894},"getAlbumMediaQuery",{"type":25,"tag":56,"props":896,"children":897},{"style":63},[898],{"type":31,"value":899},"($albumId, $filter ",{"type":25,"tag":56,"props":901,"children":903},{"style":902},"--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-sepia:#F92672",[904],{"type":31,"value":905},"=",{"type":25,"tag":56,"props":907,"children":908},{"style":63},[909],{"type":31,"value":910}," null, $orderBy ",{"type":25,"tag":56,"props":912,"children":913},{"style":902},[914],{"type":31,"value":905},{"type":25,"tag":56,"props":916,"children":917},{"style":63},[918],{"type":31,"value":919}," null, $offset ",{"type":25,"tag":56,"props":921,"children":922},{"style":902},[923],{"type":31,"value":905},{"type":25,"tag":56,"props":925,"children":926},{"style":63},[927],{"type":31,"value":928}," null, $limit ",{"type":25,"tag":56,"props":930,"children":931},{"style":902},[932],{"type":31,"value":905},{"type":25,"tag":56,"props":934,"children":935},{"style":63},[936],{"type":31,"value":937}," null, $validTypes ",{"type":25,"tag":56,"props":939,"children":940},{"style":902},[941],{"type":31,"value":905},{"type":25,"tag":56,"props":943,"children":944},{"style":63},[945],{"type":31,"value":946}," null, $batch ",{"type":25,"tag":56,"props":948,"children":949},{"style":902},[950],{"type":31,"value":905},{"type":25,"tag":56,"props":952,"children":953},{"style":63},[954],{"type":31,"value":955}," null)\n",{"type":25,"tag":56,"props":957,"children":958},{"class":58,"line":267},[959],{"type":25,"tag":56,"props":960,"children":961},{"style":63},[962],{"type":31,"value":963},"{\n",{"type":25,"tag":56,"props":965,"children":967},{"class":58,"line":966},3,[968,973,977,982,988,993,998],{"type":25,"tag":56,"props":969,"children":970},{"style":63},[971],{"type":31,"value":972},"$builder ",{"type":25,"tag":56,"props":974,"children":975},{"style":902},[976],{"type":31,"value":905},{"type":25,"tag":56,"props":978,"children":979},{"style":63},[980],{"type":31,"value":981}," $",{"type":25,"tag":56,"props":983,"children":985},{"style":984},"--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-sepia:#FD971F",[986],{"type":31,"value":987},"this",{"type":25,"tag":56,"props":989,"children":990},{"style":63},[991],{"type":31,"value":992},"->",{"type":25,"tag":56,"props":994,"children":995},{"style":183},[996],{"type":31,"value":997},"getAlbumMediaQueryBuilder",{"type":25,"tag":56,"props":999,"children":1000},{"style":63},[1001],{"type":31,"value":1002},"($albumId, $filter, $orderBy, $validTypes);\n",{"type":25,"tag":56,"props":1004,"children":1006},{"class":58,"line":1005},4,[1007,1012,1017,1022],{"type":25,"tag":56,"props":1008,"children":1009},{"style":902},[1010],{"type":31,"value":1011},"if",{"type":25,"tag":56,"props":1013,"children":1014},{"style":63},[1015],{"type":31,"value":1016}," (",{"type":25,"tag":56,"props":1018,"children":1019},{"style":183},[1020],{"type":31,"value":1021},"is_numeric",{"type":25,"tag":56,"props":1023,"children":1024},{"style":63},[1025],{"type":31,"value":1026},"($batch)) {\n",{"type":25,"tag":56,"props":1028,"children":1030},{"class":58,"line":1029},5,[1031,1036,1041,1046,1051],{"type":25,"tag":56,"props":1032,"children":1033},{"style":63},[1034],{"type":31,"value":1035},"$builder->",{"type":25,"tag":56,"props":1037,"children":1038},{"style":183},[1039],{"type":31,"value":1040},"andWhere",{"type":25,"tag":56,"props":1042,"children":1043},{"style":63},[1044],{"type":31,"value":1045},"(",{"type":25,"tag":56,"props":1047,"children":1048},{"style":188},[1049],{"type":31,"value":1050},"'MOD(media.id, 1000) = ?3'",{"type":25,"tag":56,"props":1052,"children":1053},{"style":63},[1054],{"type":31,"value":1055},");\n",{"type":25,"tag":56,"props":1057,"children":1059},{"class":58,"line":1058},6,[1060,1064,1069,1073,1078],{"type":25,"tag":56,"props":1061,"children":1062},{"style":63},[1063],{"type":31,"value":1035},{"type":25,"tag":56,"props":1065,"children":1066},{"style":183},[1067],{"type":31,"value":1068},"setParameter",{"type":25,"tag":56,"props":1070,"children":1071},{"style":63},[1072],{"type":31,"value":1045},{"type":25,"tag":56,"props":1074,"children":1075},{"style":276},[1076],{"type":31,"value":1077},"3",{"type":25,"tag":56,"props":1079,"children":1080},{"style":63},[1081],{"type":31,"value":1082},", $batch);\n",{"type":25,"tag":56,"props":1084,"children":1086},{"class":58,"line":1085},7,[1087],{"type":25,"tag":56,"props":1088,"children":1089},{"style":63},[1090],{"type":31,"value":1091},"}\n",{"type":25,"tag":56,"props":1093,"children":1095},{"class":58,"line":1094},8,[1096],{"type":25,"tag":56,"props":1097,"children":1098},{"emptyLinePlaceholder":738},[1099],{"type":31,"value":1100},"\n",{"type":25,"tag":56,"props":1102,"children":1104},{"class":58,"line":1103},9,[1105,1110,1115,1120],{"type":25,"tag":56,"props":1106,"children":1107},{"style":902},[1108],{"type":31,"value":1109},"    if",{"type":25,"tag":56,"props":1111,"children":1112},{"style":63},[1113],{"type":31,"value":1114}," ($limit ",{"type":25,"tag":56,"props":1116,"children":1117},{"style":902},[1118],{"type":31,"value":1119},"!==",{"type":25,"tag":56,"props":1121,"children":1122},{"style":63},[1123],{"type":31,"value":1124}," null) {\n",{"type":25,"tag":56,"props":1126,"children":1128},{"class":58,"line":1127},10,[1129,1134,1139],{"type":25,"tag":56,"props":1130,"children":1131},{"style":63},[1132],{"type":31,"value":1133},"        $builder->",{"type":25,"tag":56,"props":1135,"children":1136},{"style":183},[1137],{"type":31,"value":1138},"setFirstResult",{"type":25,"tag":56,"props":1140,"children":1141},{"style":63},[1142],{"type":31,"value":1143},"($offset)\n",{"type":25,"tag":56,"props":1145,"children":1147},{"class":58,"line":1146},11,[1148,1153,1158],{"type":25,"tag":56,"props":1149,"children":1150},{"style":902},[1151],{"type":31,"value":1152},"                ->",{"type":25,"tag":56,"props":1154,"children":1155},{"style":183},[1156],{"type":31,"value":1157},"setMaxResults",{"type":25,"tag":56,"props":1159,"children":1160},{"style":63},[1161],{"type":31,"value":1162},"($limit);\n",{"type":25,"tag":56,"props":1164,"children":1166},{"class":58,"line":1165},12,[1167],{"type":25,"tag":56,"props":1168,"children":1169},{"style":63},[1170],{"type":31,"value":1171},"    }\n",{"type":25,"tag":56,"props":1173,"children":1175},{"class":58,"line":1174},13,[1176],{"type":25,"tag":56,"props":1177,"children":1178},{"emptyLinePlaceholder":738},[1179],{"type":31,"value":1100},{"type":25,"tag":56,"props":1181,"children":1183},{"class":58,"line":1182},14,[1184,1189,1194,1199],{"type":25,"tag":56,"props":1185,"children":1186},{"style":902},[1187],{"type":31,"value":1188},"    return",{"type":25,"tag":56,"props":1190,"children":1191},{"style":63},[1192],{"type":31,"value":1193}," $builder->",{"type":25,"tag":56,"props":1195,"children":1196},{"style":183},[1197],{"type":31,"value":1198},"getQuery",{"type":25,"tag":56,"props":1200,"children":1201},{"style":63},[1202],{"type":31,"value":1203},"();\n",{"type":25,"tag":56,"props":1205,"children":1207},{"class":58,"line":1206},15,[1208],{"type":25,"tag":56,"props":1209,"children":1210},{"style":63},[1211],{"type":31,"value":1091},{"type":25,"tag":34,"props":1213,"children":1214},{},[1215],{"type":31,"value":1216},"Es ist ein optionaler Parameter und wird nichts kaputt machen. Wenn man ein Shopware-Update durchführt, würde dies verschwinden, aber da ich auf der Suche nach einer einmaligen Aufgabe war, um die Dinge zu beschleunigen, habe ich es einfach im Kern geändert, anstatt eine langfristige Lösung zu finden.",{"type":25,"tag":34,"props":1218,"children":1219},{},[1220],{"type":31,"value":1221},"Diese Funktion berechnet ein Modulo von 1000 auf der Medien-ID und vergleicht es mit der Chargen-ID. Wir haben also im Grunde 1000 Stapel zu verarbeiten, bis alle Arbeit erledigt ist.",{"type":25,"tag":34,"props":1223,"children":1224},{},[1225],{"type":31,"value":1226},"Jetzt müssen wir nur noch alle 1000 Stapel parallel starten. Dazu habe ich das sehr hilfreiche Tool parallel verwendet, das unter Linux verfügbar ist:",{"type":25,"tag":34,"props":1228,"children":1229},{},[1230],{"type":31,"value":1231},"Es startet 64 Batches parallel und setzt seine Arbeit fort, bis alle 1000 Batches fertig sind.",{"type":25,"tag":34,"props":1233,"children":1234},{},[1235,1237,1242],{"type":31,"value":1236},"Und so sieht es bei ",{"type":25,"tag":796,"props":1238,"children":1239},{},[1240],{"type":31,"value":1241},"htop",{"type":31,"value":1243}," aus:",{"type":25,"tag":45,"props":1245,"children":1247},{"className":171,"code":1246,"language":173,"meta":7,"style":7},"parallel -j 64 ./bin/console my:image:generate:thumbnails --batch ::: {0..999}\n",[1248],{"type":25,"tag":52,"props":1249,"children":1250},{"__ignoreMap":7},[1251],{"type":25,"tag":56,"props":1252,"children":1253},{"class":58,"line":59},[1254,1259,1264,1269,1274,1279,1284,1289],{"type":25,"tag":56,"props":1255,"children":1256},{"style":183},[1257],{"type":31,"value":1258},"parallel",{"type":25,"tag":56,"props":1260,"children":1261},{"style":276},[1262],{"type":31,"value":1263}," -j",{"type":25,"tag":56,"props":1265,"children":1266},{"style":276},[1267],{"type":31,"value":1268}," 64",{"type":25,"tag":56,"props":1270,"children":1271},{"style":188},[1272],{"type":31,"value":1273}," ./bin/console",{"type":25,"tag":56,"props":1275,"children":1276},{"style":188},[1277],{"type":31,"value":1278}," my:image:generate:thumbnails",{"type":25,"tag":56,"props":1280,"children":1281},{"style":276},[1282],{"type":31,"value":1283}," --batch",{"type":25,"tag":56,"props":1285,"children":1286},{"style":188},[1287],{"type":31,"value":1288}," :::",{"type":25,"tag":56,"props":1290,"children":1291},{"style":188},[1292],{"type":31,"value":1293}," {0..999}\n",{"type":25,"tag":1295,"props":1296,"children":1301},"img",{"alt":1241,"aspect-ratio":1297,"height":1298,"object-fit":1299,"src":1300},"2",300,"contain","/blog/htop.png",[],{"type":25,"tag":26,"props":1303,"children":1305},{"id":1304},"schließlich-ist-die-ganze-arbeit-jetzt-in-35-stunden-statt-in-80-stunden-erledigt",[1306],{"type":31,"value":1307},"Schließlich ist die ganze Arbeit jetzt in 3,5 Stunden statt in 80 Stunden erledigt.",{"type":25,"tag":580,"props":1309,"children":1310},{},[1311],{"type":31,"value":584},{"title":7,"searchDepth":267,"depth":267,"links":1313},[1314,1315,1316],{"id":769,"depth":267,"text":772},{"id":826,"depth":267,"text":829},{"id":1304,"depth":267,"text":1307},{"_path":611,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":612,"description":613,"author":10,"image":614,"releaseDate":615,"blogCategories":1318,"articleTags":1319,"tags":1320,"body":1321,"_type":590,"_id":623,"_source":592,"_file":624,"_stem":625,"_extension":595},[14,15],[618,619],[621,622],{"type":22,"children":1322,"toc":1388},[1323,1329,1350,1355,1360,1366,1378,1383],{"type":25,"tag":26,"props":1324,"children":1326},{"id":1325},"was-ist-das",[1327],{"type":31,"value":1328},"Was ist das?",{"type":25,"tag":34,"props":1330,"children":1331},{},[1332,1334,1340,1342,1348],{"type":31,"value":1333},"Dieser Wrapper dient als einfache und kosteneffiziente Brücke, die Aufrufe von der\n",{"type":25,"tag":784,"props":1335,"children":1337},{"href":1336},"https://docs.developer.amazonservices.com/en_US/dev_guide/index.html",[1338],{"type":31,"value":1339},"Amazon Marketplace Web Service (MWS)",{"type":31,"value":1341},"\nAPI zu ",{"type":25,"tag":784,"props":1343,"children":1345},{"href":1344},"https://developer-docs.amazon.com/sp-api",[1346],{"type":31,"value":1347},"Selling Partner (SP) API",{"type":31,"value":1349}," Aufrufen übersetzt. Er wurde speziell für Kunden mit veralteten Systemen und begrenztem\nBudget entwickelt, für die eine komplette Neuentwicklung der Amazon-Schnittstelle wirtschaftlich untragbar wäre. Der\nWrapper ermöglicht es diesen Kunden, ihr Geschäft auch nach der Abschaltung der MWS-Schnittstelle fortzuführen.",{"type":25,"tag":34,"props":1351,"children":1352},{},[1353],{"type":31,"value":1354},"Technisch basiert das Projekt auf einem Docker-Container, der als Webserver fungiert. Dieser nimmt MWS-API-Aufrufe\nentgegen, übersetzt sie in SP-API-Aufrufe und wandelt die Antworten der SP-API wieder in das Format der MWS-API um.",{"type":25,"tag":34,"props":1356,"children":1357},{},[1358],{"type":31,"value":1359},"Die Idee für diesen Wrapper entstand aus einem Proof of Concept, mit dem Ziel zu überprüfen, ob die Schnittstellen\nausreichend ähnlich sind, um eine direkte Übersetzung zu ermöglichen. Trotz der Befürchtung, dass der Teufel im Detail\nliegen könnte, erwiesen sich die Aufrufe als relativ einfach zu übersetzen. Es war lediglich notwendig, einige\nFeed-Namen anzupassen und gelegentlich aus einem API-Aufruf zwei zu machen, um alle notwendigen Informationen zu erhalten.\nInsgesamt gestaltete sich das Projekt überraschend problemlos.",{"type":25,"tag":26,"props":1361,"children":1363},{"id":1362},"download",[1364],{"type":31,"value":1365},"Download",{"type":25,"tag":34,"props":1367,"children":1368},{},[1369,1371,1377],{"type":31,"value":1370},"Interesse geweckt? Das Projekt wurde als Open-Source auf Github veröffentlicht:\n",{"type":25,"tag":784,"props":1372,"children":1374},{"href":1373},"https://github.com/bhelm/Amazon-MWS-SP-Wrapper",[1375],{"type":31,"value":1376},"Amazon-MWS-SP-API-Wrapper",{"type":31,"value":113},{"type":25,"tag":34,"props":1379,"children":1380},{},[1381],{"type":31,"value":1382},"Mit diesem Angebot streben wir danach, zur Open-Source-Kultur beizutragen und erhoffen uns konstruktives Feedback von\nanderen Entwicklern.",{"type":25,"tag":34,"props":1384,"children":1385},{},[1386],{"type":31,"value":1387},"Bei Bedarf an Unterstützung bei der Integration in Ihre Anwendung oder falls Anpassungen bzw. Erweiterungen am Wrapper\nnotwendig sind, stehen wir gerne zur Verfügung. Da der Wrapper bisher nur von einer begrenzten Anzahl an Kunden genutzt\nwird, deckt er momentan auch nur einen Teil der möglichen API-Aufrufe und Parameter ab.",{"title":7,"searchDepth":267,"depth":267,"links":1389},[1390,1391],{"id":1325,"depth":267,"text":1328},{"id":1362,"depth":267,"text":1365},{"_path":630,"_dir":631,"_draft":6,"_partial":6,"_locale":7,"slug":10,"teams":1393,"primaryTeam":634,"firstName":635,"lastName":636,"prefixTitle":7,"suffixTitle":7,"education":1394,"executiveRole":642,"role":1396,"workingSince":651,"inTheCompanySince":652,"techSkills":1397,"skills":1414,"projects":1421,"contactDetails":1427,"_image":727,"image":728,"_id":729,"_type":730,"title":731,"_source":631,"_file":732,"_stem":733,"_extension":730},[633,634],[1395],[639,640,641],[644,645,634,646,647,648,649,650],[1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413],{"name":655,"level":656,"icon":657},{"name":18,"level":656,"icon":659},{"name":661,"level":656},{"name":663,"level":656,"icon":664},{"name":666,"level":656},{"name":668,"level":656,"icon":669},{"name":671,"level":656},{"name":673,"level":656},{"name":675,"level":656},{"name":677,"level":656,"icon":678},{"name":680,"level":681,"icon":682},{"name":684,"level":681,"icon":685},{"name":687,"level":681,"icon":688},{"name":690,"level":681,"icon":691},{"name":693,"level":681,"icon":694},{"name":696,"level":681,"icon":697},[1415,1416,1417,1418,1419,1420],{"name":700,"level":656},{"name":702,"level":656},{"name":704,"level":656},{"name":706,"level":656},{"name":708,"level":656},{"name":710,"level":681},[1422,1423,1424,1425,1426],{"project":713,"position":714},{"project":716,"position":714},{"project":718,"position":714},{"project":720,"position":721},{"project":723,"position":714},{"eMail":725,"phone":726,"visibility":297},1782284041458]