# ---- Stage 1: build the Vue frontend ---- FROM node:22-alpine AS web-build WORKDIR /web ENV CI=true RUN npm install -g pnpm COPY web/package.json web/pnpm-lock.yaml web/pnpm-workspace.yaml ./ RUN pnpm install --frozen-lockfile COPY web/ . RUN pnpm run build # ---- Stage 2: build the Go backend, embedding the frontend build ---- FROM golang:1.24-alpine AS server-build RUN apk add --no-cache git WORKDIR /src COPY server/go.mod server/go.sum ./ RUN go mod download COPY server/ . # Same layout the project's own Makefile produces: built frontend goes into # resource/public/admin/ before packing/building the backend. RUN rm -rf resource/public/admin && mkdir -p resource/public/admin COPY --from=web-build /web/dist/ ./resource/public/admin/ # main.go imports internal/packed. Generate the packed resource file directly # through GoFrame's library API instead of installing the full gf CLI in CI. RUN printf '%s\n' \ 'package main' \ 'import "github.com/gogf/gf/v2/os/gres"' \ 'func main() {' \ ' if err := gres.PackToGoFileWithOption("resource", "internal/packed/packed.go", "packed", gres.Option{}); err != nil { panic(err) }' \ '}' > /tmp/pack.go \ && go run /tmp/pack.go \ && rm /tmp/pack.go RUN CGO_ENABLED=0 go build -o /out/hotgo main.go # ---- Stage 3: runtime ---- FROM alpine:3.22 RUN apk add --no-cache ca-certificates gettext bash tzdata WORKDIR /app ENV QUEUE_DRIVER=kafka ENV KAFKA_ADDRESS=kafka.118im.com:30835 ENV KAFKA_VERSION=2.4.0 ENV KAFKA_USERNAME= ENV KAFKA_PASSWORD= ENV KAFKA_SASL_MECHANISM= ENV MYSQL_DSN= ENV REDIS_ADDR=redis.118im.com:30637 ENV REDIS_DB=2 ENV REDIS_PASSWORD= ENV TOKEN_SECRET_KEY=hotgo123 ENV IM_ADMIN_API_BASE_URL=https://api.118im.com ENV IM_ADMIN_API_SERVICE_ID=hotgo-admin ENV IM_ADMIN_API_SECRET= ENV IM_INTERNAL_API_BASE_URL=https://api.118im.com ENV IM_INTERNAL_API_SERVICE_NAME=hotgo-admin ENV IM_INTERNAL_API_SECRET= ENV IM_WORKBENCH_API_BASE_URL=http://im_workbench:6061 ENV IM_WORKBENCH_API_SERVICE_NAME=hotgo-admin ENV IM_WORKBENCH_API_SECRET= ENV IM_CONFIG_API_SERVICE_NAME=im-server ENV IM_CONFIG_API_SECRET= COPY --from=server-build /src/manifest ./manifest COPY --from=server-build /src/hack ./hack COPY --from=server-build /out/hotgo . COPY server/manifest/docker/entrypoint.sh . RUN mkdir -p storage/logs storage/data storage/cache storage/diskqueue \ && chmod +x entrypoint.sh hotgo HEALTHCHECK --interval=1m --timeout=3s --start-period=20s \ CMD wget -q -O /dev/null http://localhost:8000/healthz || exit 1 EXPOSE 8000 ENTRYPOINT ["./entrypoint.sh"]