Skip to content

sunmery/golang_web_devops_dir_structure

Repository files navigation

Golang Web DevOps Dir

本项目是根据个人的喜好做的一个 Golang Web DevOps的项目目录结构, 包含一些示例

  • 面向接口编程
  • 后端使用 gin
  • 鉴权使用 JWT
  • 前端使用 React + Electron + Vite
  • 数据库使用 GORM + Postgres/Mysql + Redis
  • 运维部署使用 Kubectl + Kubernetes 与 Dockerfile + docker-compose 或 gitlab + gitlab-Runner方式
  • 命名:
    • 目录名全部小写
    • 文件名遵循蛇形命名法
    • 导出的函数遵循大驼峰命名法, 包内部私有字段以及不对外暴露的函数,方法,变量使用小驼峰命名法

目录结构

  • assets 共享的静态资产(静态文件, 图像, 音视频...)
  • build 打包目录
    • ci 存放gitlab-ci.ymlCI脚本
    • package 存放云,操作系统, Dockerfile, docker-compose 等
  • client 存放客户端文件
  • config 与CI/CD Dockerfile 等工具结合的配置
  • cmd 存放可执行文件, 非 sh,bat 脚本的指令文件
  • docs 设计文档, 说明文件
  • examples 存储应用程序示例目录
  • internal 私有文件夹, 不对外共享
    • api 存放 JSON等文件数据
    • handler 处理 HTTP 请求
    • middleware 中间件, 例如 CORS, 拦截器
    • repository 数据库
    • router 路由服务
    • schema/model/dao 存放与数据库映射的类型与方法
    • Kubernetes 存放 k8s 部署的文件
  • pkg 存储公共方法
    • config 对外开放的 config 配置, 例如数据库配置
      • ssl 存储 HTTPS证书
    • helper 工具函数
  • scripts 存放脚本
    • migrations sql迁移文件
  • test 测试文件夹

Backend list

  1. Web 服务器: gin
  2. Web 跨域处理: cors
  3. 日志: slog
  4. 环境变量: godotenv
  5. 开发热重启: air

Frontend

Cors

  1. React
  2. Electron
  3. Typescript
  4. Vite
  5. vite-plugin-electron

Web 项目工程化

  1. husky
  2. commitlint
  3. ESLint
    1. lint-staged
    2. eslint-config-alloy
    3. eslint-import-resolver-typescript
    4. eslint-plugin-import
    5. eslint-plugin-react
    6. eslint-plugin-react-hooks
    7. eslint-plugin-react-hooks-addons
    8. eslint-plugin-react-refresh
    9. eslint-plugin-simple-import-sort
    10. eslint-plugin-typescript-enum
  4. Stylelint+
    1. stylelint-config-recess-order
    2. stylelint-config-standard
    3. stylelint-config-standard-scss

安装

  1. 安装依赖

    p i -D lint-staged husky @commitlint/cli @commitlint/config-conventional eslint eslint-config-alloy @typescript-eslint/parser eslint-plugin-import eslint-import-resolver-typescript eslint-import-resolver-typescript eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-react-hooks-addons eslint-plugin-simple-import-sort eslint-plugin-typescript-enum lint-staged typescript
  2. 先创建.git仓库

    git init
    
  3. package.json添加prepare指令

    { 
        "scripts": { 
            "prepare": "husky install"
         }
    }
  4. prepare脚本会在执行npm install之后自动执行。执行npm install安装完项目依赖后会执行 husky install命令。

    pnpm i

    (可选)命令行

    npm set-script prepare "husky install" && npm run prepare
  5. 添加git hooks, 创建一条 pre-commit hook

    npx husky add .husky/pre-commit "pnpm lint"

    执行该命令后,会看到.husky/目录下新增了一个名为pre-commitshell脚本。之后执行git commit 命令时会先触发pre-commit这个脚本。 脚本内容:

    #!/bin/sh 
    . "$(dirname "$0")/_/husky.sh" 
    pnpm lint
    
  6. 修改pre-commit脚本, 改成项目所需的指令, 例如ESLint,Stylelint,commitlint检查

    #!/usr/bin/env sh
    . "$(dirname -- "$0")/_/husky.sh"
    
    tsc --noEmit && pnpm stylelint:fix && pnpm dlx lint-staged
    
  7. 添加commitlint规范

    npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'

Database

(可选) Deployment

  1. kubernetes
  2. Dockerfile
  3. docker-compose
  4. gitlab-runner

kubernetes

  1. 进入根目录的kubernetesdeployment目录下

  2. 部署 Golang 应用 在kubernetes集群运行:

    kubectl apply -f golang-app-deployment.yaml
  3. 部署 Web 应用 在kubernetes集群运行:

    kubectl apply -f golang-app-deployment.yaml
  4. 部署 Golang 应用 在kubernetes集群运行:

    kubectl apply -f web-app-deployment.yaml
  5. 部署 Postgres 数据库 在kubernetes集群运行:

    kubectl apply -f postgres-deployment.yaml

gitlab-runner

  1. 可根据此篇文章安装Gitlab
  2. 可根据此篇文章安装gitlab-runner
  3. 在根目录创建.gitlab-ci.yml文件,参考examples/ci/backend/.gitlab-ci.yml 后端部署文件或examples/ci/frontend/.gitlab-ci.yml前端部署文件针对你的需求个性化

Used

前置条件

  1. Node.js 14+ 版本以上运行环境
  2. Golang 1.16+ 版本以上运行环境
  3. Postgres PG 数据库环境. 项目自带Postgres部署环境, Kubernetes 部署方式在根目录的Kubernetes/deplotment/postgres-deployment.yaml, Docker 部署方式在根目录的cmd/Dockerfile
  4. (可选) Kubernetes(K8S) 版本推荐 1.20 以上, 使用Containerd 容器运行时(CRI)
  5. (可选) 至少 3台Linux服务器, 1个 master 主控节点, 2 个Node/Worker 节点. 推荐 2个 master 主控节点, 4个Node/Worker 节点

编写配置文件

  • 数据库配置: 填写在根目录的pkg -> config -> db.development.yaml开发配置与db.production.yaml生产模式配置文件
  • (可选) 将 HTTPS服务器的 crtkey证书的文件复制至 pkg -> config -> ssl目录即可运行TLS服务
  • (可选) 修改pkg -> config -> jwt.yaml JWT 秘钥

安装后端服务

  1. air 开发热重启
    go install github.com/cosmtrek/air@latest

安装前端服务

  1. 进入到项目的前端目录Client.

    cd client
  2. 任选你喜欢的一个包管理器安装依赖, 例如npm,pnpm,yarn, 只要你安装了它.

    • npm:
    npm install
    • pnpm:
    pnpm i
    • yarn:
    yarn

运行后端服务

开发

  • 普通运行

    go run .
    • air 方式运行

      • mode: 运行模式, 项目内置dev开发与prod生产模式, 不同模式使用不同的配置文件运行程序的方式, 默认为dev开发模式
      • port: 运行端口, 项目运行的端口,默认端口为4000.
      1. 示例1: 使用8080 端口的开发模式.

            air -- -mode=dev -port=8080
      2. 示例2: 使用443 端口的生产模式.

            air -- -mode=prod -port=443
  • (推荐)Markfile方式运行 Golang 程序与Swagger

make all

打包

  • (推荐)Markfile方式运行
make build
  • go 自带
go build -o .

运行 Web 服务.

- npm:
```shell
npm run dev
```

- pnpm:
```shell
pnpm dev
```

- yarn
yarn dev

Test

  • 运行所有测试用例

    go test
  • 单个测试

    go test ./test/file_test.go
  • HTTP 测试 (仅适用于 jetbrains系列的 IDEA, WebStorm, Goland IDE)

  1. 参考<project>/examples/http/test/api.http文件
  2. 修改<project>/test/http-client.env.json为你的项目URI地址
  3. 打开<project>/test/api.http, 修改这些示例为你项目真实的接口地址, 点击左侧运行图标即可运行 HTTP 请求
  • sql迁移测试
  1. 打开test目录
  2. 运行init_pg_data_test.go
    go test init_pg_data_test.go
  3. Postgrestests数据库查看sql 文件数据迁移是否成功

About

golang web devops dir structure

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published