From 4144628cb6c0dcc53226201f2ce5144344013548 Mon Sep 17 00:00:00 2001 From: Chever John Date: Sun, 14 Jun 2026 12:38:46 +0800 Subject: [PATCH] build(deploy): replace pre-compiled arm64 binaries with multi-stage Go compilation for amd64 WHY: existing Dockerfiles copied pre-compiled arm64 binaries which cannot run on the amd64 K3s cluster (exec format error). Also fixed port conflicts when running muyu alongside iloom in docker-compose. HOW: - rewrite 3 Dockerfiles (system/inventory/gateway) to multi-stage builds using golang:1.24-alpine with CGO_ENABLED=0 GOARCH=amd64 - parameterize host ports in docker-compose to avoid conflicts (3306->13306, 6379->16379, 8080->18080) - fix inv_product unique key from product_name-only to composite (product_name, spec, color) to allow same-name products with different specs - add X-Token to Authorization header middleware in gateway for iloom frontend compatibility Co-Authored-By: Claude Opus 4.6 --- deploy/Dockerfile.gateway | 12 ++++++++++-- deploy/Dockerfile.inventory | 12 ++++++++++-- deploy/Dockerfile.system | 12 ++++++++++-- deploy/docker-compose.yaml | 6 +++--- deploy/mysql/init.sql | 2 +- gateway/gateway.go | 9 +++++++++ 6 files changed, 43 insertions(+), 10 deletions(-) diff --git a/deploy/Dockerfile.gateway b/deploy/Dockerfile.gateway index de3f122..22aae9e 100644 --- a/deploy/Dockerfile.gateway +++ b/deploy/Dockerfile.gateway @@ -1,7 +1,15 @@ -FROM alpine:3.19 +FROM golang:1.24-alpine AS builder +RUN apk add --no-cache git +WORKDIR /app +COPY go.mod go.sum ./ +RUN go mod download +COPY . . +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /server ./gateway/gateway.go + +FROM alpine:3.20 RUN apk add --no-cache ca-certificates tzdata WORKDIR /app -COPY deploy/bin/gateway . +COPY --from=builder /server ./gateway COPY deploy/etc/gateway.yaml etc/gateway.yaml EXPOSE 8888 CMD ["./gateway", "-f", "etc/gateway.yaml"] diff --git a/deploy/Dockerfile.inventory b/deploy/Dockerfile.inventory index 80ede24..a056444 100644 --- a/deploy/Dockerfile.inventory +++ b/deploy/Dockerfile.inventory @@ -1,7 +1,15 @@ -FROM alpine:3.19 +FROM golang:1.24-alpine AS builder +RUN apk add --no-cache git +WORKDIR /app +COPY go.mod go.sum ./ +RUN go mod download +COPY . . +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /server ./rpc/inventory/inventory.go + +FROM alpine:3.20 RUN apk add --no-cache ca-certificates tzdata WORKDIR /app -COPY deploy/bin/inventory . +COPY --from=builder /server ./inventory COPY deploy/etc/inventory.yaml etc/inventory.yaml EXPOSE 9002 CMD ["./inventory", "-f", "etc/inventory.yaml"] diff --git a/deploy/Dockerfile.system b/deploy/Dockerfile.system index e27367e..b939a03 100644 --- a/deploy/Dockerfile.system +++ b/deploy/Dockerfile.system @@ -1,7 +1,15 @@ -FROM alpine:3.19 +FROM golang:1.24-alpine AS builder +RUN apk add --no-cache git +WORKDIR /app +COPY go.mod go.sum ./ +RUN go mod download +COPY . . +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /server ./rpc/system/system.go + +FROM alpine:3.20 RUN apk add --no-cache ca-certificates tzdata WORKDIR /app -COPY deploy/bin/system . +COPY --from=builder /server ./system COPY deploy/etc/system.yaml etc/system.yaml EXPOSE 9001 CMD ["./system", "-f", "etc/system.yaml"] diff --git a/deploy/docker-compose.yaml b/deploy/docker-compose.yaml index 78c25d6..3728d0a 100644 --- a/deploy/docker-compose.yaml +++ b/deploy/docker-compose.yaml @@ -8,7 +8,7 @@ services: MYSQL_DATABASE: muyu_wms TZ: Asia/Shanghai ports: - - "3306:3306" + - "${MYSQL_PORT:-13306}:3306" volumes: - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql - ../data/mysql:/var/lib/mysql @@ -24,7 +24,7 @@ services: container_name: muyu-redis restart: always ports: - - "6379:6379" + - "${REDIS_PORT:-16379}:6379" volumes: - ../data/redis:/data healthcheck: @@ -106,7 +106,7 @@ services: container_name: muyu-nginx restart: always ports: - - "8080:80" + - "${NGINX_PORT:-18080}:80" volumes: - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf - ../../muyu-portal/dist:/usr/share/nginx/html diff --git a/deploy/mysql/init.sql b/deploy/mysql/init.sql index 19e972e..7d56dad 100644 --- a/deploy/mysql/init.sql +++ b/deploy/mysql/init.sql @@ -146,7 +146,7 @@ CREATE TABLE `inv_product` ( `deleted_at` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_product_id` (`product_id`), - UNIQUE KEY `uk_product_name` (`product_name`), + UNIQUE KEY `uk_product_name_spec_color` (`product_name`, `spec`, `color`), KEY `idx_color` (`color`), KEY `idx_location` (`location`), KEY `idx_status` (`status`), diff --git a/gateway/gateway.go b/gateway/gateway.go index e002bdd..07b6af0 100644 --- a/gateway/gateway.go +++ b/gateway/gateway.go @@ -36,6 +36,15 @@ func main() { server := rest.MustNewServer(c.RestConf, rest.WithCors()) defer server.Stop() + server.Use(func(next http.HandlerFunc) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if token := r.Header.Get("X-Token"); token != "" { + r.Header.Set("Authorization", "Bearer "+token) + } + next(w, r) + } + }) + httpx.SetErrorHandlerCtx(func(ctx context.Context, err error) (int, interface{}) { s, ok := status.FromError(err) if ok {