81 lines
2.5 KiB
Docker
81 lines
2.5 KiB
Docker
# ---- 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.workbench-system.svc.cluster.local: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"]
|