Skip to Content
BlogHTTP-Proxys (Bun, Node, Docker, k8s)

HTTP-Proxys richtig setzen: Bun, Node, Docker und Kubernetes

Martin MöllenbeckProcessCube CLICubyEngineProxyNO_PROXYNode.jsBunDockerKubernetesk3s

In Unternehmensnetzen läuft ausgehender Traffic häufig über einen HTTP-Proxy. Damit ProcessCube®-Komponenten dorthin finden, steuern drei Umgebungsvariablen das Verhalten: HTTP_PROXY, HTTPS_PROXY, NO_PROXY. Die Tücke: Bun und Node gehen unterschiedlich damit um, und in Docker und Kubernetes kommen Fallstricke dazu.

Welche Komponente läuft worauf?

Welche Regeln gelten, hängt von der Laufzeit-Basis der jeweiligen Komponente ab:

KomponenteBasismaßgeblicher Abschnitt
CubyBunBun
ProcessCube CLI (pc)BunBun
EngineNode.jsNode
Low-CodeNode.jsNode
App-SDKNode.jsNode
StudioNode.js (Electron)Node

Faustregel: Bun-Komponenten verstehen die Proxy-Variablen sofort, Node-Komponenten brauchen NODE_USE_ENV_PROXY=1 (oder eine Bibliothek).

Die drei Variablen

VariableWofür
HTTP_PROXYProxy für http://-Requests
HTTPS_PROXYProxy für https://-Requests (der Großteil)
NO_PROXYKomma-Liste von Hosts/Domains/CIDRs, die direkt (ohne Proxy) erreicht werden
  • Der Wert von HTTPS_PROXY ist meist selbst eine http://-URL — der Proxy spricht HTTP-CONNECT, nicht TLS.
  • Groß-/Kleinschreibung: Viele Werkzeuge lesen sowohl HTTPS_PROXY als auch https_proxy. Im Zweifel beide setzen.

NO_PROXY ist nicht standardisiert — das Matching unterscheidet sich je nach Runtime, und das ist der häufigste Stolperstein:

RuntimeNO_PROXY-Matching
Node (NODE_USE_ENV_PROXY)nur Hostname: exakter Treffer oder .suffix/Wildcard (Endung). Kein CIDR.
Bunhostnamenbasiert (kein bestätigtes CIDR)
Go-Tools (k3s, containerd, kubectl)Hostname/Suffix und CIDR (10.0.0.0/8)

CIDR (10.42.0.0/16) gehört nicht in das NO_PROXY einer Node- oder Bun-Anwendung — es würde dort nur als literaler Hostname „10.42.0.0/16” interpretiert und nie greifen. Node/Bun matchen den Hostnamen der Ziel-URL, nicht die aufgelöste IP. In Kubernetes also auf DNS-Suffixe setzen (.svc.cluster.local), nicht auf Pod-/Service-CIDRs. CIDR ist Sache der Go-basierten Cluster-Komponenten (siehe unten).

Bun — versteht die Variablen nativ

Bun respektiert HTTP_PROXY / HTTPS_PROXY / NO_PROXY in fetch() und bei bun install ohne weiteres Zutun. Da die ProcessCube® CLI ein Bun-Single-Binary ist, gilt das direkt für pc:

export HTTPS_PROXY=http://proxy.firma.local:8080 export NO_PROXY=localhost,127.0.0.1,.firma.local pc engine login --url https://engine.extern.example.com
  • Per-Request lässt sich der Proxy auch über die proxy-Option von fetch() setzen.
  • Seit Bun 1.3.9 wird NO_PROXY auch dann ausgewertet, wenn ein Proxy explizit über die proxy-Option übergeben wird.

Node — opt-in (Node 24) oder Bibliothek

Anders als Bun ignoriert Nodes eingebautes fetch / node:http / node:https die Proxy-Variablen standardmäßig.

NODE_USE_ENV_PROXY=1 (oder das Flag --use-env-proxy) aktiviert, dass die Variablen ausgewertet werden — für fetch() ab Node 24.0 bzw. 22.21 (LTS-Backport), für node:http/node:https ab 24.5 bzw. 22.21. Noch als experimentell markiert, daher opt-in:

NODE_USE_ENV_PROXY=1 \ HTTPS_PROXY=http://proxy.firma.local:8080 \ NO_PROXY=localhost,127.0.0.1 \ node app.js

HTTPS_PROXY greift nur für https://-Ziele. Interne Engine-/Authority-URLs wie http://localhost:56000 fallen unter HTTP_PROXY — meist gehören sie aber in NO_PROXY.

Docker

Für Paket-Installationen während des Builds (npm/bun install) die Proxy-Werte als Build-Args übergeben (HTTP_PROXY, HTTPS_PROXY, NO_PROXY sind vordefinierte Build-Args):

docker build \ --build-arg HTTPS_PROXY=http://proxy.firma.local:8080 \ --build-arg NO_PROXY=localhost,127.0.0.1,.firma.local \ -t meine-app .

NO_PROXY muss Container-/Service-Namen und localhost enthalten, damit Container-zu-Container-Verkehr (z. B. Engine ↔ Authority ↔ Postgres) nicht über den Proxy läuft. Der Image-Pull des Docker-Daemons ist davon getrennt und wird über die Daemon-Konfiguration (~/.docker/config.json bzw. systemd) gesteuert.

Kubernetes / k3s

In Pods werden die Variablen am saubersten über eine ConfigMap gesetzt und per envFrom eingebunden:

apiVersion: v1 kind: ConfigMap metadata: name: proxy-env data: HTTP_PROXY: "http://proxy.firma.local:8080" HTTPS_PROXY: "http://proxy.firma.local:8080" # App-Pods (Node/Bun) matchen per Hostname → DNS-Suffixe, KEINE CIDRs NO_PROXY: "localhost,127.0.0.1,.svc,.svc.cluster.local,.cluster.local"
# Deployment (Auszug) spec: template: spec: containers: - name: engine envFrom: - configMapRef: name: proxy-env env: - name: NODE_USE_ENV_PROXY # Engine/Low-Code laufen auf Node 24 value: "1"

Der häufigste Fehler: NO_PROXY zu knapp — dann läuft auch In-Cluster-Verkehr (API-Server, Services, DNS) über den Proxy und bricht. Entscheidend ist, wer den Verkehr macht:

  • App-Pods (Node/Bun) sprechen Services über DNS an (authority.processcube-prd.svc.cluster.local). Da das Matching hostnamenbasiert ist, decken die DNS-Suffixe .svc, .svc.cluster.local, .cluster.local (+ localhost) den internen Verkehr ab. CIDRs bringen hier nichts (s. o.).
  • CIDRs (Pod-/Service-Range, k3s-Defaults 10.42.0.0/16 / 10.43.0.0/16) greifen nur bei den Go-basierten Komponenten — und die verwalten das selbst (siehe k3s unten).

Für k3s selbst (Image-Pulls über containerd, Go) gehören die Proxy-Variablen in die systemd-Env-Datei:

# /etc/systemd/system/k3s.service.env HTTP_PROXY=http://proxy.firma.local:8080 HTTPS_PROXY=http://proxy.firma.local:8080 NO_PROXY=localhost,127.0.0.1

k3s ergänzt die Cluster-internen Pod-/Service-CIDRs und die Cluster-DNS-Domain automatisch zu NO_PROXY seines eigenen Prozesses — die obige Liste reicht daher für k3s aus. Für die Anwendungs-Pods gilt das jedoch nicht; dort die vollständige NO_PROXY-Liste (siehe ConfigMap oben) selbst pflegen.

Checkliste

  • HTTPS_PROXY gesetzt (nicht nur HTTP_PROXY) — der meiste Traffic ist https://.
  • ✅ Proxy-Wert als http://…-URL (nicht https://).
  • ✅ Node: NODE_USE_ENV_PROXY=1 (Node 24) oder eine Proxy-Bibliothek — sonst wirkungslos.
  • NO_PROXY umfasst interne Ziele: localhost, Engine/Authority, Service-Namen, in k8s die Cluster-DNS-Suffixe (.svc.cluster.local). CIDRs nur für Go-Tools (k3s/containerd), nicht für Node/Bun.
  • ✅ Im Zweifel Groß- und Kleinschreibung der Variablen setzen.

Weiterführend