[{"data":1,"prerenderedAt":743},["ShallowReactive",2],{"doc-\u002Fde\u002Fdeployment":3,"docnav-de":158},{"id":4,"title":5,"body":6,"description":150,"extension":151,"meta":152,"nav":78,"navigation":153,"path":154,"seo":155,"stem":156,"__hash__":157},"docs\u002Fde\u002Fdeployment.md","Deployment",{"type":7,"value":8,"toc":144},"minimark",[9,14,28,32,35,58,105,112,116,123,127,130,140],[10,11,13],"h2",{"id":12},"winget-verlangt-https","winget verlangt HTTPS",[15,16,17,18,22,23,27],"p",{},"Eine winget-REST-Quelle muss über ",[19,20,21],"strong",{},"HTTPS mit vertrauenswürdigem Zertifikat"," laufen (bei neueren\nwinget-Versionen auch für ",[24,25,26],"code",{},"localhost","). Plane TLS für jeden Endpunkt, mit dem Clients sprechen.",[10,29,31],{"id":30},"origin-via-docker","Origin via Docker",[15,33,34],{},"Der Community-Stack ist App + PostgreSQL. Zwei Reverse-Proxy-Varianten sind dabei:",[36,37,38,49],"ul",{},[39,40,41,44,45,48],"li",{},[19,42,43],{},"Caddy"," (",[24,46,47],{},"docker-compose.yml",") — automatisches Let's Encrypt für eine öffentliche Domain.",[39,50,51,44,54,57],{},[19,52,53],{},"Vorhandener Traefik",[24,55,56],{},"docker-compose.traefik.yml",") — ohne Caddy; die App hängt sich in\nTraefiks Netz und wird per Labels geroutet. Ideal, wenn Port 80\u002F443 schon von Traefik belegt ist.",[59,60,65],"pre",{"className":61,"code":62,"language":63,"meta":64,"style":64},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# hinter vorhandenem Traefik:\ndocker compose -f docker-compose.traefik.yml --env-file .env.deploy up -d\n","bash","",[24,66,67,76],{"__ignoreMap":64},[68,69,72],"span",{"class":70,"line":71},"line",1,[68,73,75],{"class":74},"sHwdD","# hinter vorhandenem Traefik:\n",[68,77,79,83,87,90,93,96,99,102],{"class":70,"line":78},2,[68,80,82],{"class":81},"sBMFI","docker",[68,84,86],{"class":85},"sfazB"," compose",[68,88,89],{"class":85}," -f",[68,91,92],{"class":85}," docker-compose.traefik.yml",[68,94,95],{"class":85}," --env-file",[68,97,98],{"class":85}," .env.deploy",[68,100,101],{"class":85}," up",[68,103,104],{"class":85}," -d\n",[15,106,107,108,111],{},"Setze ",[24,109,110],{},"KVELLMAN_IMAGE"," auf ein vorgebautes Image (woanders gebaut und in eine Registry gepusht), um\nnicht auf einem kleinen Server zu bauen; Migrationen laufen beim Container-Start automatisch.",[10,113,115],{"id":114},"edge-mirror-nodes-enterprise","Edge-\u002FMirror-Nodes (Enterprise)",[15,117,118,119,122],{},"Ein Standort kann einen headless ",[19,120,121],{},"Edge-Node"," betreiben, der die winget-API und Installer-Downloads\nlokal ausliefert und bei Bedarf von der Origin cached. Clients tragen den Node als Quelle ein; die\nerste Installation zieht über den Node, der Rest aus dem LAN. Nodes enrollen sich bei der Origin\n(Einmal-Key → dauerhafte mTLS-Identität) und werden zentral gesteuert (Paket-Scope, Installer-Filter,\nPush\u002FVorab-Spiegeln, Health).",[10,124,126],{"id":125},"telemetrie-schalter","Telemetrie & Schalter",[15,128,129],{},"Repository-Nutzungstelemetrie (Suchen, Manifest-Abrufe, Downloads) ist standardmäßig aus und wird\nper Umgebungsvariable aktiviert. Gleiches Muster gilt für den Upstream-Katalog-Sync und einen\nGitHub-Token für Importe.",[131,132,133],"blockquote",{},[15,134,135,136,139],{},"Die vollständige Schritt-für-Schritt-Anleitung (Origin, Edge-Node unter WSL, TLS für LAN\u002Flocalhost,\nRegistry-Workflow) steht in ",[24,137,138],{},"DEPLOYMENT.md"," im Open-Core-Repository.",[141,142,143],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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);}",{"title":64,"searchDepth":78,"depth":78,"links":145},[146,147,148,149],{"id":12,"depth":78,"text":13},{"id":30,"depth":78,"text":31},{"id":114,"depth":78,"text":115},{"id":125,"depth":78,"text":126},"Origin mit Docker hinter Caddy oder vorhandenem Traefik betreiben, plus Edge-Nodes.","md",{},true,"\u002Fde\u002Fdeployment",{"title":5,"description":150},"de\u002Fdeployment","-j5lkcIPmI1PgQ0FNATHb8ZLE9OJTWjDhlPpUOyAKxA",[159,355,440,626],{"id":160,"title":161,"body":162,"description":349,"extension":151,"meta":350,"nav":71,"navigation":153,"path":351,"seo":352,"stem":353,"__hash__":354},"docs\u002Fde\u002Fgetting-started.md","Erste Schritte",{"type":7,"value":163,"toc":342},[164,168,175,179,186,254,261,265,276,280,287,309,312,316,339],[10,165,167],{"id":166},"was-ist-kvellman","Was ist kvellman?",[15,169,170,171,174],{},"kvellman ist ein selbst-gehostetes, ",[19,172,173],{},"winget-kompatibles"," Paket-Repository. Du trägst es als\nzusätzliche winget-Quelle ein — die winget-CLI fragt es genauso ab wie die offizielle\nMicrosoft-Quelle. Keine Client-Änderungen, keine eigenen Installer.",[10,176,178],{"id":177},"_1-origin-starten-docker","1. Origin starten (Docker)",[15,180,181,182,185],{},"Die Community-Edition läuft aus einem einzigen ",[24,183,184],{},"docker compose","-Stack (App + PostgreSQL). Mit einer\nDomain, die auf deinen Host zeigt, und offenen Ports 80\u002F443:",[59,187,189],{"className":61,"code":188,"language":63,"meta":64,"style":64},"git clone \u003Copen-core-repo> kvellman && cd kvellman\ncp .env.deploy.example .env.deploy   # DOMAIN, NUXT_SESSION_PASSWORD, POSTGRES_PASSWORD setzen\ndocker compose --env-file .env.deploy up -d\n",[24,190,191,226,239],{"__ignoreMap":64},[68,192,193,196,199,203,206,210,213,216,219,223],{"class":70,"line":71},[68,194,195],{"class":81},"git",[68,197,198],{"class":85}," clone",[68,200,202],{"class":201},"sMK4o"," \u003C",[68,204,205],{"class":85},"open-core-rep",[68,207,209],{"class":208},"sTEyZ","o",[68,211,212],{"class":201},">",[68,214,215],{"class":85}," kvellman",[68,217,218],{"class":201}," &&",[68,220,222],{"class":221},"s2Zo4"," cd",[68,224,225],{"class":85}," kvellman\n",[68,227,228,231,234,236],{"class":70,"line":78},[68,229,230],{"class":81},"cp",[68,232,233],{"class":85}," .env.deploy.example",[68,235,98],{"class":85},[68,237,238],{"class":74},"   # DOMAIN, NUXT_SESSION_PASSWORD, POSTGRES_PASSWORD setzen\n",[68,240,242,244,246,248,250,252],{"class":70,"line":241},3,[68,243,82],{"class":81},[68,245,86],{"class":85},[68,247,95],{"class":85},[68,249,98],{"class":85},[68,251,101],{"class":85},[68,253,104],{"class":85},[15,255,256,257,260],{},"Die DB-Migrationen laufen beim Start automatisch. Öffne ",[24,258,259],{},"https:\u002F\u002Fdeine-domain",", um den ersten\nAdmin-Account anzulegen.",[10,262,264],{"id":263},"_2-paket-bereitstellen","2. Paket bereitstellen",[15,266,267,268,271,272,275],{},"In der Web-UI: ein ",[19,269,270],{},"Site-Token"," anlegen (Admin → Site-Tokens), dann ein ",[19,273,274],{},"Manifest hochladen","\noder aus dem winget-Katalog importieren. Optional den Installer lokal speichern, damit er von deiner\nOrigin ausgeliefert wird.",[10,277,279],{"id":278},"_3-quelle-am-client-hinzufügen","3. Quelle am Client hinzufügen",[15,281,282,283,286],{},"winget verlangt ",[19,284,285],{},"HTTPS"," für eine REST-Quelle. Auf einem Windows-Client (PowerShell):",[59,288,292],{"className":289,"code":290,"language":291,"meta":64,"style":64},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","winget source add --name kvellman --type Microsoft.Rest --arg \"https:\u002F\u002Fdeine-domain\u002Fapi\u002F\u003Csite-token>\"\nwinget search --source kvellman \u003Cbegriff>\nwinget install --source kvellman \u003CPackage.Identifier>\n","powershell",[24,293,294,299,304],{"__ignoreMap":64},[68,295,296],{"class":70,"line":71},[68,297,298],{},"winget source add --name kvellman --type Microsoft.Rest --arg \"https:\u002F\u002Fdeine-domain\u002Fapi\u002F\u003Csite-token>\"\n",[68,300,301],{"class":70,"line":78},[68,302,303],{},"winget search --source kvellman \u003Cbegriff>\n",[68,305,306],{"class":70,"line":241},[68,307,308],{},"winget install --source kvellman \u003CPackage.Identifier>\n",[15,310,311],{},"Fertig — Clients installieren interne Software jetzt über deine eigene winget-Quelle.",[10,313,315],{"id":314},"nächste-schritte","Nächste Schritte",[36,317,318,325,332],{},[39,319,320,324],{},[321,322,5],"a",{"href":323},"\u002Fdocs\u002Fdeployment"," — Docker, Reverse-Proxys (Caddy\u002FTraefik), Edge-Nodes, TLS.",[39,326,327,331],{},[321,328,330],{"href":329},"\u002Fdocs\u002Farchitecture","Architektur"," — wie winget-API, Site-Tokens und Spiegelung zusammenspielen.",[39,333,334,338],{},[321,335,337],{"href":336},"\u002Fdocs\u002Feditions-licensing","Editionen & Lizenzierung"," — Community vs. Enterprise.",[141,340,341],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":64,"searchDepth":78,"depth":78,"links":343},[344,345,346,347,348],{"id":166,"depth":78,"text":167},{"id":177,"depth":78,"text":178},{"id":263,"depth":78,"text":264},{"id":278,"depth":78,"text":279},{"id":314,"depth":78,"text":315},"Eine kvellman-Origin starten und in Minuten als winget-Quelle hinzufügen.",{},"\u002Fde\u002Fgetting-started",{"title":161,"description":349},"de\u002Fgetting-started","rrhJf7cKGwzix7mvmIM-3b6lWdutwJBMUkWAKsyAAUk",{"id":4,"title":5,"body":356,"description":150,"extension":151,"meta":438,"nav":78,"navigation":153,"path":154,"seo":439,"stem":156,"__hash__":157},{"type":7,"value":357,"toc":432},[358,360,366,368,370,384,410,414,416,420,422,424,430],[10,359,13],{"id":12},[15,361,17,362,22,364,27],{},[19,363,21],{},[24,365,26],{},[10,367,31],{"id":30},[15,369,34],{},[36,371,372,378],{},[39,373,374,44,376,48],{},[19,375,43],{},[24,377,47],{},[39,379,380,44,382,57],{},[19,381,53],{},[24,383,56],{},[59,385,386],{"className":61,"code":62,"language":63,"meta":64,"style":64},[24,387,388,392],{"__ignoreMap":64},[68,389,390],{"class":70,"line":71},[68,391,75],{"class":74},[68,393,394,396,398,400,402,404,406,408],{"class":70,"line":78},[68,395,82],{"class":81},[68,397,86],{"class":85},[68,399,89],{"class":85},[68,401,92],{"class":85},[68,403,95],{"class":85},[68,405,98],{"class":85},[68,407,101],{"class":85},[68,409,104],{"class":85},[15,411,107,412,111],{},[24,413,110],{},[10,415,115],{"id":114},[15,417,118,418,122],{},[19,419,121],{},[10,421,126],{"id":125},[15,423,129],{},[131,425,426],{},[15,427,135,428,139],{},[24,429,138],{},[141,431,143],{},{"title":64,"searchDepth":78,"depth":78,"links":433},[434,435,436,437],{"id":12,"depth":78,"text":13},{"id":30,"depth":78,"text":31},{"id":114,"depth":78,"text":115},{"id":125,"depth":78,"text":126},{},{"title":5,"description":150},{"id":441,"title":337,"body":442,"description":620,"extension":151,"meta":621,"nav":241,"navigation":153,"path":622,"seo":623,"stem":624,"__hash__":625},"docs\u002Fde\u002Feditions-licensing.md",{"type":7,"value":443,"toc":615},[444,448,462,538,546,550,557,591,594,598,601],[10,445,447],{"id":446},"open-core","Open Core",[15,449,450,451,453,454,457,458,461],{},"kvellman ist ",[19,452,447],{},". Die Plattform ist quelloffen unter ",[19,455,456],{},"Apache-2.0","; erweiterte Funktionen\nkommen als ",[19,459,460],{},"kommerzielle Plugins"," (z. B. SSO, MFA), die nur mit gültiger Enterprise-Lizenz aktiv\nwerden.",[463,464,465,480],"table",{},[466,467,468],"thead",{},[469,470,471,474,477],"tr",{},[472,473],"th",{},[472,475,476],{},"Community",[472,478,479],{},"Enterprise",[481,482,483,494,505,516,527],"tbody",{},[469,484,485,489,491],{},[486,487,488],"td",{},"Lizenz",[486,490,456],{},[486,492,493],{},"Kommerzielles Abo",[469,495,496,499,502],{},[486,497,498],{},"Nutzer",[486,500,501],{},"Einzeln \u002F lokale Konten",[486,503,504],{},"Mehrbenutzer, RBAC",[469,506,507,510,513],{},[486,508,509],{},"Auth",[486,511,512],{},"Lokal",[486,514,515],{},"SSO (OIDC) + MFA (TOTP)",[469,517,518,521,524],{},[486,519,520],{},"Skalierung",[486,522,523],{},"Single-Node",[486,525,526],{},"Hochverfügbarkeit, Edge-Nodes",[469,528,529,532,535],{},[486,530,531],{},"Betrieb",[486,533,534],{},"Kern",[486,536,537],{},"Genehmigungs-Workflow + Audit, Air-Gap, Release-Scraper",[15,539,540,541,545],{},"Der vollständige Vergleich steht unter ",[321,542,544],{"href":543},"\u002Fpricing","Preise",".",[10,547,549],{"id":548},"wie-die-lizenzierung-funktioniert","Wie die Lizenzierung funktioniert",[15,551,552,553,556],{},"Enterprise-Funktionen werden über eine ",[19,554,555],{},"offline, signaturbasierte"," Lizenz freigeschaltet — kein\nAktivierungsserver, funktioniert also air-gapped:",[558,559,560,566,573,588],"ol",{},[39,561,562,563,545],{},"Eine Lizenz ist ein vom Hersteller ",[19,564,565],{},"Ed25519-signiertes Token",[39,567,568,569,572],{},"Das Produkt enthält nur den ",[19,570,571],{},"öffentlichen Schlüssel"," und prüft das Token lokal.",[39,574,575,576,579,580,583,584,587],{},"Das Token nennt Kunde und aktive ",[19,577,578],{},"Entitlements"," (z. B. ",[24,581,582],{},"sso",", ",[24,585,586],{},"mfa",") sowie ein Ablaufdatum.",[39,589,590],{},"Ein Admin fügt das Token in der UI ein; passende Plugins werden sofort aktiv — ohne Neustart,\nohne Internet.",[15,592,593],{},"Da die Prüfung lokal erfolgt, kann selbst der vollständige Open-Source-Code keine gültige Lizenz\nfälschen, solange der private Schlüssel des Herstellers geheim bleibt.",[10,595,597],{"id":596},"entwickler-pakete","Entwickler-Pakete",[15,599,600],{},"Die gemeinsamen, öffentlichen Bausteine liegen auf npm unter Apache-2.0:",[36,602,603,609],{},[39,604,605,608],{},[24,606,607],{},"@kvellman\u002Fwinget-contract"," — der von Origin und Nodes geteilte winget-REST-\u002FTypen-Vertrag.",[39,610,611,614],{},[24,612,613],{},"@kvellman\u002Fplugin-sdk"," — Typen zum Bauen von Auth-\u002FEntitlement-Plugins.",{"title":64,"searchDepth":78,"depth":78,"links":616},[617,618,619],{"id":446,"depth":78,"text":447},{"id":548,"depth":78,"text":549},{"id":596,"depth":78,"text":597},"Open-Core-Modell — Community (Apache-2.0) vs. Enterprise, und wie die Lizenzierung funktioniert.",{},"\u002Fde\u002Feditions-licensing",{"title":337,"description":620},"de\u002Feditions-licensing","w0UfaQHHod93tPhOw66j1b5BDgIOEAQiOFMI9e-wC7I",{"id":627,"title":330,"body":628,"description":736,"extension":151,"meta":737,"nav":738,"navigation":153,"path":739,"seo":740,"stem":741,"__hash__":742},"docs\u002Fde\u002Farchitecture.md",{"type":7,"value":629,"toc":729},[630,634,637,657,661,692,696,715,719,722,726],[10,631,633],{"id":632},"winget-source-api","winget-Source-API",[15,635,636],{},"kvellman setzt den winget-Source-REST-Vertrag exakt um, sodass die winget-CLI es wie jede andere\nQuelle behandelt:",[36,638,639,645,651],{},[39,640,641,644],{},[24,642,643],{},"GET \u002Fapi\u002F{siteToken}\u002Finformation"," — Quell-Metadaten und unterstützte Versionen.",[39,646,647,650],{},[24,648,649],{},"POST \u002Fapi\u002F{siteToken}\u002FmanifestSearch"," — Volltextsuche.",[39,652,653,656],{},[24,654,655],{},"GET \u002Fapi\u002F{siteToken}\u002FpackageManifests\u002F{id}"," — Manifest-Auslieferung mit serverseitiger Auflösung.",[10,658,660],{"id":659},"site-kontext","Site-Kontext",[15,662,663,664,666,667,670,671,674,675,678,679,583,682,583,685,583,688,691],{},"winget sendet keine eigenen Header, daher steckt der Standort-Kontext im URL-",[19,665,270],{},"\n(primär), ergänzt durch ",[19,668,669],{},"Subnetz"," und ",[19,672,673],{},"mTLS-Client-Zertifikat",". Der aufgelöste Kontext steuert\nserverseitige ",[24,676,677],{},"InstallerUrl","-Platzhalter (",[24,680,681],{},"$REPO_URL",[24,683,684],{},"$SITE",[24,686,687],{},"$LOCATION",[24,689,690],{},"$LANG",") — so kann\ndasselbe Manifest auf eine standortlokale SMB\u002FDFS-Freigabe zeigen, ohne geforkt zu werden.",[10,693,695],{"id":694},"manifeste-overlays-ablage","Manifeste, Overlays & Ablage",[15,697,698,699,702,703,706,707,710,711,714],{},"Manifeste sind versioniertes YAML, beim Upload gegen die offiziellen winget-JSON-Schemas validiert.\nLokale Änderungen liegen als ",[19,700,701],{},"Overlay"," über dem unangetasteten Upstream, und ",[19,704,705],{},"Overlay-Vorlagen","\nje Paket machen wiederkehrende Anpassungen (z. B. eine interne Mirror-URL mit ",[24,708,709],{},"$VERSION","\u002F",[24,712,713],{},"$ARCH",")\nüber Versionen hinweg einfach. Installer lassen sich nach S3\u002FMinIO oder SMB spiegeln; Hashes werden\nbei der Auslieferung neu berechnet.",[10,716,718],{"id":717},"edge-mirror-nodes","Edge-\u002FMirror-Nodes",[15,720,721],{},"Edge-Nodes sind schlanke Cache-Proxys, die die winget-API + Downloads lokal ausliefern und lazy von\nder Origin holen. Sie halten einen Offline-Suchindex, enrollen via mTLS und werden zentral\neingeschränkt (welche Pakete, welche Installer-Architekturen\u002F-Scopes) und von der Origin überwacht.",[10,723,725],{"id":724},"stack","Stack",[15,727,728],{},"Nuxt 4 (Vue 3 + Nitro), TypeScript, PostgreSQL + Drizzle ORM, S3-kompatible Ablage, BullMQ\u002FRedis für\nHintergrundjobs. Ausschließlich On-Premise — voll selbst-hostbar, inklusive Air-Gap-Betrieb.",{"title":64,"searchDepth":78,"depth":78,"links":730},[731,732,733,734,735],{"id":632,"depth":78,"text":633},{"id":659,"depth":78,"text":660},{"id":694,"depth":78,"text":695},{"id":717,"depth":78,"text":718},{"id":724,"depth":78,"text":725},"Wie winget-Source-API, Site-Kontext, Spiegelung und Edge-Nodes zusammenspielen.",{},4,"\u002Fde\u002Farchitecture",{"title":330,"description":736},"de\u002Farchitecture","GmvMCx1uCHAIyNFsm-SDay1Ou_VPhUgf02yYI3oKgaY",1782195177368]