From 3dced742e61650614e0c93adc9af8b305b182553 Mon Sep 17 00:00:00 2001 From: GoCo Date: Sat, 19 Jul 2025 20:26:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20docker=20compose?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 64 +++++++++++++ deploy/hack/config.yaml | 47 ++++++++++ {resources/docker => deploy}/init.sql | 0 .../manifest}/config/casbin.conf | 0 .../manifest/config/config.example.yaml | 0 .../manifest/config/config.yaml | 4 +- compose.yaml => docker-compose.yaml | 53 +++++------ resources/docker/Dockerfile | 61 ------------- resources/docker/nginx/gmanager.conf | 89 ------------------- resources/docker/nginx/nginx.conf | 32 ------- server/hack/config.yaml | 4 +- 11 files changed, 142 insertions(+), 212 deletions(-) create mode 100644 Dockerfile create mode 100644 deploy/hack/config.yaml rename {resources/docker => deploy}/init.sql (100%) rename {resources/docker => deploy/manifest}/config/casbin.conf (100%) rename resources/docker/config/config.yaml => deploy/manifest/config/config.example.yaml (100%) rename resources/docker/config/config.example.yaml => deploy/manifest/config/config.yaml (99%) rename compose.yaml => docker-compose.yaml (61%) delete mode 100644 resources/docker/Dockerfile delete mode 100644 resources/docker/nginx/gmanager.conf delete mode 100644 resources/docker/nginx/nginx.conf diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..16195cd --- /dev/null +++ b/Dockerfile @@ -0,0 +1,64 @@ +# 使用官方 Go 镜像作为基础镜像 +FROM golang:1.24.4-alpine AS builder + +# 安装必要的工具 +RUN apk update && apk add tzdata +RUN apk add --no-cache nodejs npm git + +# 安装 pnpm +RUN npm install -g pnpm + +# 设置工作目录 +WORKDIR /app + +# 复制后端 +COPY ./server ./server +# 复制前端 +COPY ./web ./web + +# 构建前端项目 +WORKDIR /app/web +RUN echo "y" |pnpm install +RUN pnpm run build + +# 构建后端项目 +WORKDIR /app/server + +# 删除之前的web资源并重新创建目录 +RUN rm -rf ./resource/public/admin/ +RUN mkdir -p ./resource/public/admin/ + +# 复制编译好的web资源到server目录 +RUN cp -rf ../web/dist/* ./resource/public/admin/ + +# 编译hotgo服务端 +RUN go mod download + +# 安装gf +RUN wget -O gf "https://github.com/gogf/gf/releases/latest/download/gf_$(go env GOOS)_$(go env GOARCH)" && chmod +x gf && ./gf install -y && rm ./gf + +RUN gf build + +# 使用轻量级的 alpine 镜像作为运行环境 +FROM alpine:latest + +# 安装 ca-certificates 用于 HTTPS 请求 +RUN apk --no-cache add ca-certificates tzdata + +# 设置时区 +ENV TZ=Asia/Shanghai + +# 设置工作目录 +WORKDIR /app + +# 从构建阶段复制编译好的二进制文件 +COPY --from=builder /app/server/temp/hotgo . + +# 复制配置文件(如果存在) +COPY --from=builder /app/server/manifest/config/ ./manifest/config/ + +# 暴露端口 +EXPOSE 8000 + +WORKDIR /app +CMD ./hotgo \ No newline at end of file diff --git a/deploy/hack/config.yaml b/deploy/hack/config.yaml new file mode 100644 index 0000000..efeca59 --- /dev/null +++ b/deploy/hack/config.yaml @@ -0,0 +1,47 @@ +# CLI tool, only in development environment. +# https://goframe.org/pages/viewpage.action?pageId=3673173 +gfcli: + build: + name: "hotgo" # 编译后的可执行文件名称 + # arch: "amd64" # 不填默认当前系统架构,可选:386,amd64,arm,all + # system: "linux" # 不填默认当前系统平台,可选:linux,darwin,windows,all + mod: "none" + cgo: 0 + packSrc: "resource" # 将resource目录打包进可执行文件,静态资源无需单独部署 + packDst: "internal/packed/packed.go" # 打包后生成的Go文件路径,一般使用相对路径指定到本项目目录中 + version: "" + output: "./temp/hotgo" # 可执行文件生成路径 + extra: "" + + + docker: + build: "-a amd64 -s linux -p temp -ew" # 构建参数 + tagPrefixes: # 该docker的标记前缀,用于docker推送,请替换成你自己的 + - ccr.ccs.tencentyun.com/bufanyun + + + gen: + dao: + - link: "mysql:root:gmanager123!@tcp(mysql)/hotgo?loc=Local&parseTime=true&charset=utf8mb4" + group: "default" # 分组 使用hotgo代码生成功能时必须填 + # tables: "" # 指定当前数据库中需要执行代码生成的数据表。如果为空,表示数据库的所有表都会生成。 + tablesEx: "hg_sys_addons_install" # 指定当前数据库中需要排除代码生成的数据表。 + removePrefix: "hg_" + descriptionTag: true + noModelComment: true + jsonCase: "CamelLower" + gJsonSupport: true + clear: false + + +# service: # 生成业务配置 +# srcFolder: "internal/logic" +# dstFolder: "internal/service" +# dstFileNameCase: "CamelLower" +# clear: true + ctrl: + # api/api下的接口可以使用gf gen ctrl自动生成控制器相关代码 + srcFolder: "api/api" + dstFolder: "internal/controller/api" + clear: true + merge: false diff --git a/resources/docker/init.sql b/deploy/init.sql similarity index 100% rename from resources/docker/init.sql rename to deploy/init.sql diff --git a/resources/docker/config/casbin.conf b/deploy/manifest/config/casbin.conf similarity index 100% rename from resources/docker/config/casbin.conf rename to deploy/manifest/config/casbin.conf diff --git a/resources/docker/config/config.yaml b/deploy/manifest/config/config.example.yaml similarity index 100% rename from resources/docker/config/config.yaml rename to deploy/manifest/config/config.example.yaml diff --git a/resources/docker/config/config.example.yaml b/deploy/manifest/config/config.yaml similarity index 99% rename from resources/docker/config/config.example.yaml rename to deploy/manifest/config/config.yaml index f5695c7..463e445 100644 --- a/resources/docker/config/config.example.yaml +++ b/deploy/manifest/config/config.yaml @@ -75,14 +75,14 @@ tcp: cron: group: "cron" # 分组名称 name: "cron1" # 客户端名称 - address: gmanager-server:8099 # 服务器地址 + address: "127.0.0.1:8099" # 服务器地址 appId: "1002" # 应用名称 secretKey: "hotgo" # 密钥 # 系统授权 auth: group: "auth" # 分组名称 name: "auth1" # 客户端名称 - address: gmanager-server:8099 # 服务器地址 + address: "127.0.0.1:8099" # 服务器地址 appId: "mengshuai" # 应用名称 secretKey: "123456" # 密钥 diff --git a/compose.yaml b/docker-compose.yaml similarity index 61% rename from compose.yaml rename to docker-compose.yaml index e5df8fd..c1a10be 100644 --- a/compose.yaml +++ b/docker-compose.yaml @@ -1,26 +1,26 @@ services: - nginx: - build: - dockerfile: ./resources/docker/Dockerfile - target: gmanager-nginx - ports: - - 80:80 - environment: - - NGINX_HOST=gmanager - - NGINX_PORT=80 - volumes: - - ./resources/docker/nginx/gmanager.conf:/etc/nginx/conf.d/gmanager.conf - - ./resources/docker/nginx/nginx.conf:/etc/nginx/nginx.conf - depends_on: - mysql: - condition: service_healthy - gmanager-server: - condition: service_started - networks: - - gmanager - restart: on-failure - extra_hosts: - - "host.docker.internal:host-gateway" + # nginx: + # build: + # dockerfile: ./resources/docker/Dockerfile + # target: gmanager-nginx + # ports: + # - 80:80 + # environment: + # - NGINX_HOST=gmanager + # - NGINX_PORT=80 + # volumes: + # - ./resources/docker/nginx/gmanager.conf:/etc/nginx/conf.d/gmanager.conf + # - ./resources/docker/nginx/nginx.conf:/etc/nginx/nginx.conf + # depends_on: + # mysql: + # condition: service_healthy + # gmanager-server: + # condition: service_started + # networks: + # - gmanager + # restart: on-failure + # extra_hosts: + # - "host.docker.internal:host-gateway" mysql: # mysql:5.7 linux/arm64 image is unavailable. @@ -42,7 +42,7 @@ services: - 3306:3306 volumes: - mysql_data:/var/lib/mysql - - ./resources/docker/init.sql:/data/application/init.sql + - ./deploy/init.sql:/data/application/init.sql networks: - gmanager healthcheck: @@ -66,8 +66,7 @@ services: gmanager-server: build: - dockerfile: ./resources/docker/Dockerfile - target: gmanager-server + dockerfile: ./Dockerfile container_name: gmanager-server depends_on: mysql: @@ -75,7 +74,9 @@ services: ports: - 8000:8000 volumes: - - ./resources/docker/config/config.example.yaml:/app/config.yaml + - ./deploy/manifest/config/config.yaml:/app/manifest/config/config.yaml + - ./deploy/manifest/config/casbin.conf:/app/manifest/config/casbin.conf + - ./deploy/hack/config.yaml:/app/hack/config.yaml networks: - gmanager restart: on-failure diff --git a/resources/docker/Dockerfile b/resources/docker/Dockerfile deleted file mode 100644 index aaa2f07..0000000 --- a/resources/docker/Dockerfile +++ /dev/null @@ -1,61 +0,0 @@ - -############################################################################### -# SERVER -############################################################################### - -# 第一阶段:编译go项目 -FROM golang:1.24.4-alpine as server-builder -ENV WORKDIR /app -WORKDIR $WORKDIR - -COPY ./server . - -RUN go env -w GOPROXY=https://goproxy.cn,direct -RUN go mod download -RUN go mod tidy -RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main main.go - -# 第二阶段:部署server项目 -FROM alpine:3.21.3 as gmanager-server - -RUN apk update && apk add tzdata - -ENV WORKDIR /app -# 复制编译后的静态文件和启动文件 -COPY --from=server-builder /app/resource $WORKDIR/resource -COPY --from=server-builder /app/main $WORKDIR/main -RUN chmod +x $WORKDIR/main - -# 暴露端口 -EXPOSE 8000 - -WORKDIR $WORKDIR -CMD ./main - - -############################################################################### -# NGINX -############################################################################### - -# 第一阶段:编译pnpm项目 -FROM node:22.16.0-alpine as nginx-builder -# 安装pnpm -RUN npm install -g pnpm -# 设置镜像 -RUN pnpm config set registry https://registry.npmmirror.com/ -# 复制项目文件 -WORKDIR /app -COPY ./web . -# 安装依赖并编译 -RUN rm -rf node_modules -RUN pnpm install -RUN pnpm build - -# 第二阶段:使用Nginx部署 -FROM nginx:latest as gmanager-nginx -# 复制编译后的静态文件 -COPY --from=nginx-builder /app/dist /app/dist -# 暴露端口 -EXPOSE 80 -# 启动Nginx -CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/resources/docker/nginx/gmanager.conf b/resources/docker/nginx/gmanager.conf deleted file mode 100644 index 00062f1..0000000 --- a/resources/docker/nginx/gmanager.conf +++ /dev/null @@ -1,89 +0,0 @@ -server { - listen 80; - server_name _; - - location /admin { - proxy_pass http://gmanager-server:8000/; - proxy_set_header Host $host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_http_version 1.1; - proxy_set_header Connection ""; - proxy_buffering off; - proxy_read_timeout 3600s; - proxy_send_timeout 3600s; - } - - # swagger api.json - location ~/(api.json|swagger) { - proxy_pass http://gmanager-server:8000; - proxy_set_header Host $host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_http_version 1.1; - proxy_set_header Connection ""; - proxy_buffering off; - proxy_read_timeout 3600s; - proxy_send_timeout 3600s; - } - - location / { - root /app/dist; - index index.html; - try_files $uri $uri/ /index.html; - } - - # websocket - location = /socket { - proxy_pass http://gmanager-server:8000/socket; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header Host $host; - proxy_set_header X-NginX-Proxy true; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "Upgrade"; - proxy_connect_timeout 600s; - proxy_read_timeout 600; - proxy_send_timeout 600s; - } - - # # http - # location ^~ / { - # proxy_set_header Host $http_host; - # proxy_set_header X-Real-IP $remote_addr; - # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - # proxy_set_header X-Forwarded-Proto $scheme; - # proxy_pass http://gmanager-server:8000/; - # proxy_redirect off; - # proxy_buffering off; - # proxy_http_version 1.1; - # proxy_set_header Upgrade $http_upgrade; - # proxy_set_header Connection upgrade; - # } - - # # swagger api.json - # location ~/(api.json|swagger) { - # proxy_pass http://gmanager-server:8000; - # proxy_set_header Host $host; - # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - # proxy_set_header X-Forwarded-Proto $scheme; - # proxy_http_version 1.1; - # proxy_set_header Connection ""; - # proxy_buffering off; - # proxy_read_timeout 3600s; - # proxy_send_timeout 3600s; - # } - - # location / { - # root /app/dist; - # index index.html; - # try_files $uri $uri/ /index.html; - # } - - # Cache-Control: max-age~@~AExpires - location ~ ^/static/(css|js|media)/ { - expires 10y; - access_log off; - } -} \ No newline at end of file diff --git a/resources/docker/nginx/nginx.conf b/resources/docker/nginx/nginx.conf deleted file mode 100644 index c84344e..0000000 --- a/resources/docker/nginx/nginx.conf +++ /dev/null @@ -1,32 +0,0 @@ -user root; -worker_processes auto; - -error_log /var/log/nginx/error.log notice; -pid /var/run/nginx.pid; - - -events { - worker_connections 1024; -} - - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - access_log /var/log/nginx/access.log main; - - sendfile on; - #tcp_nopush on; - - keepalive_timeout 65; - - #gzip on; - client_max_body_size 1024M; - - include /etc/nginx/conf.d/gmanager.conf; -} \ No newline at end of file diff --git a/server/hack/config.yaml b/server/hack/config.yaml index e424a92..c98a438 100644 --- a/server/hack/config.yaml +++ b/server/hack/config.yaml @@ -3,8 +3,8 @@ gfcli: build: name: "hotgo" # 编译后的可执行文件名称 - arch: "amd64" # 不填默认当前系统架构,可选:386,amd64,arm,all - system: "linux" # 不填默认当前系统平台,可选:linux,darwin,windows,all + # arch: "amd64" # 不填默认当前系统架构,可选:386,amd64,arm,all + # system: "linux" # 不填默认当前系统平台,可选:linux,darwin,windows,all mod: "none" cgo: 0 packSrc: "resource" # 将resource目录打包进可执行文件,静态资源无需单独部署