商店現已上線

我們打造用於網站、AI 智慧體和 LLM 訓練的 Workstation AI 機器——線上配置併購買。

獲取同行價格
AI 產品
AI 實驗室OpenAI 智慧體Claude 代理Grok BotWorkstation AI 原生 CRM營銷所有產品
AI 解決方案
應用型 AIAI 智慧體生成式 AIAI 自動化AI 技能提升中小企業 AI 套餐企業 AI 實驗室AI 工作站NVIDIA 硬體與軟體NVIDIA 加速計算私有 AIGPU 私有云GPU 叢集邊緣 AI行業 AI
AI 服務
平臺現代化數字工程資料基礎與 AI自主運營AI 諮詢DevOps 自動化網路安全軟體開發智慧體構建MLOps 搭建GPU 租賃GPU 私有云
關於我們
公司我們的故事合作伙伴客戶案例
AI 資料中心
AI 資料中心GPU 私有云GPU 叢集GPU 租賃
AI 洞察Jev 系列基準測試實驗室模型選擇
技術說明
文件
Linux 作業系統UbuntuRed Hat Enterprise LinuxSUSE LinuxAlpine LinuxDebian、Rocky 與 AlmaLinux
AI 雲平臺AWS 與 Amazon BedrockGoogle Cloud 與 Vertex AIMicrosoft Azure 與 AI FoundryGPU 雲與算力市場
私有 AI 資料中心面向律師事務所面向會計師事務所本地部署平臺全面安全的雲
工具Ring PromoterJobshout
新聞
部落格
聯絡我們登入

面向現代企業的 AI 工作站、AI 多智慧體軟體、GPU 基礎設施和智慧代理解決方案。

聯絡我們

AI 解決方案

應用型 AIAI 智慧體生成式 AIAI 自動化AI 技能提升中小企業 AI 套餐企業 AI 實驗室行業 AI

產品

所有產品Workstation AI native CRM 與 ERP營銷OpenAI 智慧體Ring PromoterJobshout

公司

關於我們公司AI 資料中心為什麼選擇Workstation合作伙伴客戶案例定價聯絡TenthMatrix

資源

AI 洞察技術說明文件Linux 作業系統AI 雲平臺私有 AI 資料中心部落格搜尋網站地圖
英國總部
77-79 Marlowes, Hemel Hempstead HP1 1LF路線指引 — 從 M25 外環倫敦 20 號出口駛出公司編號: 11641870週一至週五:上午 9:00 - 下午 6:00 GMT
+44 7515 356 146
比利時辦公室
Workstation SRL, Rue Vanderkindere 34, 1180 Uccle, BrusselsBE 0751.518.683週一至週五:上午 9:00 - 下午 6:00 CET
+32 492 45 67 46
印度辦公室
#159 Sector 9, Pocket 1, DDA Flats, 110077 Dwarka, New Delhi
+91 98881 98841
台灣辦公室
3F, No. 2-4, Aisi Rd., Ren'ai Dist., Keelung City 200, Taiwan基隆市仁愛區愛四路2之4號3樓週一至週五:上午 9:00 - 下午 6:00 臺灣時間(GMT+8)
+886 926 892 701+32 492 45 67 46

© 2026 Workstation AI。保留所有權利。

隱私資料刪除Cookie服務條款網站地圖

NVIDIA、NVIDIA 標誌、RTX、RTX PRO、Blackwell、CUDA、NVLink、MGX、Omniverse、Spectrum-X、Quantum、BlueField、DGX 與 HGX 為 NVIDIA Corporation 在美國及其他國家的商標及/或註冊商標。AMD、AMD Arrow 標誌、EPYC、Instinct、Ryzen 與 Threadripper 為 Advanced Micro Devices, Inc. 的商標。Dell 與 PowerEdge 為 Dell Inc. 或其子公司的商標。Intel 與 Xeon 為 Intel Corporation 或其子公司的商標。AMAX、AceleMax 與 LiquidMax 為 AMAX Engineering Corporation 的商標。所有其他產品名稱、標誌與品牌均為其各自所有者之財產。我們使用它們僅為識別我們所描述、供應或支援的產品;使用這些名稱並不表示其所有者為我們背書。

Loading blog...

首頁 / 部落格
DevOpsSREKubernetesAutomationAIPerformance

Faster WSLProxy Deploys: Prebuilt Images, Build Cache — and Using AI So the Pipeline Work Actually Ships

Stop compiling OpenResty on every POP — prebuilt images, Buildx/GHA cache, DEPLOY_MODE=code for day-2, and an honest take on AI-assisted infra delivery

Balinder Walia2026年9月20日6 min read
Faster WSLProxy deploys with prebuilt images and build cache

Workstation WSL Proxy (WSLProxy) — stop compiling OpenResty on every POP. Treat the binary tree as a cached artefact, keep day-2 deploys on the fast path, and admit why teams rarely ship this until an AI-assisted loop makes the cross-cutting work finishable. Deep dive: long technote. Product: /wsl-proxy · wslproxy.org.

Faster WSLProxy deploys — prebuilt images, Build cache, day-2 code path

Bottom line. Compile OpenResty once in CI into bwalia/wslproxy-openresty, warm the layers with Buildx/GHA cache, extract on bare metal without wiping live conf/html/logs, and prefer DEPLOY_MODE=code for routine work. Timings are environment-dependent — the shape of the win is compile-once vs on-host, plus cache hits. AI did not invent prebuilt OpenResty; it made the boring multi-file project cheap enough to finish.

The hook: full deploys that mostly compile nginx

Bare-metal WSLProxy POPs historically ran an on-host OpenResty compile via Ansible (openresty.sh.j2). A DEPLOY_MODE=full or build job could spend a large fraction of wall clock on ./configure, make, luarocks, and opm — then fail for brittle host reasons (PATH, GCC, missing ldconfig, stale download URLs). Cold Next.js admin builds stacked more minutes on top. Everyone agrees “we should optimise the pipeline later.” Later rarely arrives.

Why developers normally do not get to it

Day-2 work is features, incidents, and customer-facing bugs. A painful but survivable full deploy stays on the backlog for months. The fix is cross-cutting: multi-stage Dockerfile, Hub credentials, GHA Buildx cache, Ansible extract/rsync that must not clobber live trees, DEPLOY_MODE defaults, npm/.next caches, and glibc/base-image coupling. Failure modes are opaque. Reviewers rightly fear wiping a POP’s nginx tree. Teams defer rather than risk it.

LHS — prebuilt image and Buildx/GHA cache

Left: image factory with Buildx and Hub; right: delivery pipeline and DEPLOY_MODE

The left-hand side is an image factory. You are not “running OpenResty in Docker on the POP” as the primary story — you are using Docker as a reproducible build and distribution format, then extracting the tree onto bare metal.

  • CI builds infra/openresty-prebuilt/Dockerfile with Buildx and pushes bwalia/wslproxy-openresty:<version> + :latest.
  • build-openresty-prebuilt.yml uses cache-from / cache-to: type=gha,mode=max so late-stage tweaks (for example the MinIO client URL) do not recompile everything from cold. Path filters mean routine Lua edits do not rebuild the image.
  • Ansible default openresty_install_mode: prebuilt (see role defaults) — controller docker pull → create → docker cp → rsync to the target, excluding nginx/conf, nginx/html, nginx/logs. See openresty_prebuilt.yml and the express helper openresty-express-install.sh.
  • Platform today: linux/amd64 only. Base image defaults to debian:13 — glibc/arch must match the host. Provenance and SBOM generation are disabled in that workflow by choice; document the trade-off rather than moralising.

One citeable warm rebuild after iterative fixes: Actions run 35500698371 (~3 minutes with cache after ldconfig/mc fixes). Other timings stay qualitative — do not invent percentage savings for cold compiles or dashboard rebuilds.

When should you rebuild the OpenResty image? When the compile inputs change: OpenResty version, luarocks/opm set, mc URL, or BASE_IMAGE. When should you not? Almost every day-2 Lua, rule, or server-JSON change.

RHS — delivery pipeline and DEPLOY_MODE

The right-hand side is the full deploy story. deploy-wslproxy-delivery-pipeline.yml promotes int → smoke → test → prod (lon1 / pop0 as configured). deploy-environment.yml maps mode to Ansible tags and, when the mode includes dashboard or is full, restores npm + Next.js .next/cache so admin rebuilds are not always cold.

  • Routine day-2: prefer code (Lua/api + data) — does not recompile OpenResty.
  • build / full: OpenResty install path (prebuilt pull/extract, or legacy source if mode is overridden).
  • dashboard / dashboard-next: UI rebuild with the cache steps above.
  • nginx / servers / os_deps: scoped operations when you know the blast radius.

Readers should leave knowing three answers: when to rebuild the OpenResty image, when a code-only deploy is enough, and which GitHub files to copy as a pattern. Promotion discipline across environments pairs naturally with Ring Promoter — same “earn the next ring” mindset for edge releases. Product deep links stay on wslproxy.org.

Rules and much of the gateway behaviour reload from JSON without an nginx restart; config_status: true still drives compiled server conf and the reboot flag when listen/SSL blocks change. That separation is why day-2 can stay on code without pretending the edge is immutable.

How AI helped speed this process

Frame it as an operator + agent loop, not autopilot. Humans own intent, merge, Hub secrets, and POP risk. The agent accelerates mapping a slow job to role tags, scaffolding the Dockerfile/workflow/Ansible extract path, grepping legacy compile flags, reading failed Actions logs (ldconfig PATH, MinIO 410), and turning the landed tree into docs. The win is time-to-first-working-pipeline and stamina through two or three CI breakages — the exact reasons this work dies in normal sprints.

What stayed human: approving “image as artefact, not only runtime,” deciding which compile flags must stay identical to production, holding Hub credentials, merging to main/release, and choosing DEPLOY_MODE on a real POP. What the agent sped up: plan drafts, multi-file scaffolding, archaeology across Ansible templates, and the diagnose→patch→re-run loop when CI lied about being “flaky.”

AI did not invent prebuilt OpenResty — it made the boring, multi-file “make deploys stop compiling nginx every time” project cheap enough to finish.

Five portable tricks

Stable layers first in prebuilt and app Dockerfiles

Trick Where
Multi-stage: ship the tree, not the toolchaininfra/openresty-prebuilt/Dockerfile
Stable layers first; volatile mc / app COPY lastPrebuilt + root Dockerfile
Match BASE_IMAGE glibc/arch to the POPWorkflow dispatch inputs
Pin versions (OPENRESTY_VERSION, lua-resty-jwt 0.2.3)Dockerfile + role defaults
Cache Next/npm beside Docker layersdeploy-environment.yml

Distinguish the Docker app image (Compose / Hub runtime) from the prebuilt OpenResty tree image (bare-metal packaging). They solve different problems. The root Dockerfile still teaches the classic lesson: install heavy binaries such as mc before COPY ./api so code churn does not invalidate the expensive layers. Optional rocks can warn; required JWT rock fails closed. System Lua 5.1 builds luarocks; LuaJIT runs the gateway tree — that split is documented in the Dockerfile comments for a reason.

Copy the same cache pattern elsewhere if you build CLI or control-plane images: build-wslproxy-cli.yml and the control-plane workflow both use Buildx type=gha caches beside the OpenResty prebuilt path.

War story: ldconfig PATH and MinIO 410

Debian slim images often omit /sbin from PATH. OpenResty configure then aborts: you need ldconfig when enabling LuaJIT. Fix: install libc-bin and set PATH to include /usr/sbin:/sbin. Separately, classic dl.min.io/client/mc/… URLs now return HTTP 410; the AIStor path is current in both Dockerfiles. Agent-readable logs accelerate the patch loop; humans still merge and push Hub credentials.

Those two failures are instructive because they look like infrastructure flakiness until you read the log once. A human-alone sprint often dies after the first mysterious red build. An operator+agent loop keeps enough context in the working set to try again the same afternoon — which is why this class of work finally landed instead of rotting as a nice-to-have.

What “done” looks like for operators

After a prebuilt install you should be able to run openresty -V (or the nginx binary under the OpenResty prefix) and hit the admin health endpoint for your environment. Day-2 deploys should default to code unless OpenResty or OS dependencies changed. If someone proposes full for a Lua typo fix, push back with the LHS/RHS diagram. Keep Hub credentials and BASE_IMAGE decisions in human hands; keep the scaffolding and log triage in the agent loop when it helps.

Where to go next

  1. Long technote — Dockerfile anatomy, Ansible extract, operator playbook, AI delivery loop.
  2. GitHub: bwalia/wslproxy · prebuilt Actions.
  3. Product: wslproxy.org · Workstation WSL Proxy · promotion patterns via ringpromoter.com.

Published by Workstation. Draft content — verify claims against origin/main before a live CMS publish.