feat(gui): dockerized Windows cross-build (win-builder image + one-shot dist script) + GUI/backend scenario docs

This commit is contained in:
2026-08-16 12:49:55 +08:00
parent 47f3b44d92
commit 8843b8cca5
6 changed files with 213 additions and 8 deletions

View File

@ -0,0 +1,35 @@
# ModelRouter GUI Windows builder
# Self-sufficient cross-compilation environment for the embedded llmsproxy core.
# Produces llmsproxy.exe (Go, windows/amd64, luajit tag) + lua51.dll (LuaJIT mingw build)
# inside a mounted workspace: cmd/gui/bin/{llmsproxy.exe,lua51.dll}
#
# Build: docker build -t modelrouter/win-builder cmd/gui/docker/win-builder
# Usage: make gui-win-docker (or cmd/gui/scripts/dist-win-docker.sh)
#
# LuaJIT source is fetched from gitcode.com (CN-reachable mirror) with github
# fallback; pass --build-arg LUAJIT_REPO to override.
FROM golang:1.25
ARG LUAJIT_REPO=https://gitcode.com/openresty/luajit2.git
RUN apt-get update -qq \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y -qq \
gcc-mingw-w64-x86-64 make ca-certificates git \
&& rm -rf /var/lib/apt/lists/*
# LuaJIT cross-compiled for Windows; keeps lua51.dll and the cgo import lib
# (libluajit-5.1.dll.a -> libluajit-5.1.a in the mingw lib dir).
# NOTE: $LUAJIT_REPO deliberately unquoted in "sh -c" — quoting the ARG would
# embed literal quotes into the URL.
RUN git clone --depth 1 $LUAJIT_REPO /opt/luajit2 \
|| git clone --depth 1 https://github.com/openresty/luajit2 /opt/luajit2 \
&& cd /opt/luajit2 \
&& make HOST_CC=gcc CROSS=x86_64-w64-mingw32- TARGET_SYS=Windows TARGET_XCFLAGS=-DLUAJIT_ENABLE_LUA52COMPAT \
&& cp src/libluajit-5.1.dll.a /usr/x86_64-w64-mingw32/lib/libluajit-5.1.a
# Go proxy mirror for builds behind GFW-ish networks; overridable at runtime.
ENV GOPROXY=https://goproxy.cn,direct
WORKDIR /workspace
CMD ["/bin/bash"]

View File

@ -0,0 +1,23 @@
#!/usr/bin/env bash
# One-shot Windows release build for the GUI:
# 1) cross-compile the embedded core in docker (llmsproxy.exe + lua51.dll)
# 2) host-side electron-builder NSIS packaging (wine required on host)
# Outputs: cmd/build/gui-dist/"ModelRouter Setup <version>.exe"
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
cd "$ROOT/cmd/gui"
# 1) core (docker)
"$ROOT/cmd/gui/scripts/win-core-docker.sh"
# 2) packaging (host, needs wine for electron-builder's signtool/nsis)
command -v wine >/dev/null || { echo "wine required on host for NSIS packaging"; exit 1; }
if ! command -v npx >/dev/null; then echo "node/npm required"; exit 1; fi
echo "[dist-win] electron-builder --win nsis ..."
# bin artifacts already refreshed by win-core-docker.sh; skip the prepare step
npx electron-builder --win nsis
ls -la "$ROOT/cmd/build/gui-dist/"*.exe 2>/dev/null
echo "[dist-win] done"

View File

@ -0,0 +1,38 @@
#!/usr/bin/env bash
# Build embedded Windows core inside the self-sufficient builder image.
# - image has LuaJIT pre-built: /opt/luajit2/src/{lua51.dll, libluajit-5.1.dll.a}
# - import lib already installed at image build (libluajit-5.1.a, mingw lib dir)
# Outputs: cmd/gui/bin/{llmsproxy.exe, lua51.dll}
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
BIN_DIR="$ROOT/cmd/gui/bin"
IMAGE="${WIN_BUILDER_IMAGE:-modelrouter/win-builder}"
PROXY="${GOPROXY:-https://goproxy.cn,direct}"
command -v docker >/dev/null || {
echo "docker required"
exit 1
}
if ! docker image inspect "$IMAGE" >/dev/null 2>&1; then
echo "[win-core] building image $IMAGE ..."
docker build -t "$IMAGE" "$ROOT/cmd/gui/docker/win-builder"
fi
mkdir -p "$BIN_DIR"
echo "[win-core] cross-building llmsproxy.exe (windows/amd64, luajit) + lua51.dll ..."
docker run --rm \
-v "$ROOT":/workspace \
-e GOPROXY="$PROXY" \
-w /workspace \
"$IMAGE" bash -c '
set -euo pipefail
cp /opt/luajit2/src/lua51.dll /workspace/cmd/gui/bin/lua51.dll
GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc \
go build -buildvcs=false -tags luajit -trimpath \
-o /workspace/cmd/gui/bin/llmsproxy.exe ./cmd/llmsproxy
echo " -> core built"
'
echo "[win-core] done: $BIN_DIR/llmsproxy.exe"