本地开发环境
请确保你的本地开发环境满足以下要求:
- Golang v1.21+
- Node v18.20+
项目基本架构
GeekAI 是一个基于 Go 和 Vue 开发的,后端 API Web 框架是基于 Gin 二次开发的,前端是基于 Element-Plus + Vant(移动端) 开发的。
项目目录结构
├── api # 后端 API 程序
│ ├── bin # 编译后的二进制文件
│ ├── core # 服务核心代码
│ ├── handler # 处理器
│ ├── logger # 日志
│ ├── logs # 日志目录
│ ├── res # 资源文件
│ ├── service # 服务
│ ├── static # 静态文件
│ ├── store # 存储相关代码,如 redis,mysql,leveldb 等
│ └── utils # 工具函数
├── build # 打包脚本相关
├── database # 数据库 SQL file
├── desktop # 桌面套壳应用打包,基于 electron
├── docker # docker 部署相关,docker-compose.yaml 文件
│ ├── conf # 配置文件
│ └── data # 数据文件
└── web # 前端应用
├── dist # 编译后的文件
├── public # 静态文件
└── src # 前端源码
├── assets # 静态资源
├── components # 组件
├── lib # 库
├── store # 状态管理,session,本地数据存储
├── utils # 工具函数
└── views # 视图文件
后端启动
第一步,把项目克隆下来:
# 如果你还没有安装 git,可以先安装一下
brew install git # mac 系统
yum install git # centos 系统
apt install git # ubuntu 系统
# 克隆项目
git clone https://github.com/yangjian102621/geekai.git
cd geekai/api
第二步,创建配置文档。我们为你提供了一份样例配置文件,你只需拷贝 config.sample.toml
cp config.example.toml config.toml
接下来,你需要修改你的 MySQL 和 redis 的连接信息。
第三步,运行 Go 程序:
go run main.go
如果发现依赖下载超时,或者失败,类似错误信息如下:
那么可以尝试使用国内镜像,有两种设置方式。
第一种:直接导出环境变量
export GOPROXY=https://goproxy.cn,direct
第二种,通过 go env 设置编译环境变量
go env -w GOPROXY=https://goproxy.cn,direct
如果你想启用热部署,即每次修改自动重启 API 服务的话,可以使用 fresh
这个工具。
首先,安装 fresh:
go get github.com/pilu/fresh
# 如果没有安装成功可以试下下面的命令
go install github.com/pilu/fresh@latest
然后就使用 fresh 来实现 Golang 应用的热加载了(照样在 api 目录执行):
fresh -c fresh.conf
API 服务的默认地址是 http://localhost:5678
运行前端
首先,你需要安装依赖库:
cd web
# 安装依赖
npm install
# 如果慢的话,你可以使用 cnpm 或者 pnpm
npm install -g cnpm
cnpm install
安装成功依赖之后,启动前端服务:
npm run dev
启动成功之后访问 http://localhost:8888 预览效果
镜像打包
当产品开发完成准备在生产环境部署的时候,我们推荐你将运行程序和环境打包成 docker 镜像,使用 docker 来运行 GeekAI 应用。
视频教程:
如果您比较喜欢通过视频来学习的话,请直接观看B站视频 GeekAI SD 配置和升级二次开发教程。
1、打包 API 应用:
# 先编译
cd api
make clean amd64
# 再打包
cd ../build
docker build -t geekai-api:$version -f dockerfile-api-go ../
记得把上面的 $version
变量替换成你要打包的版本号,如 v3.2.2
2、打包前端应用
cd web
# 安装依赖
npm install
# 编译
npm run build
# 打包
cd ../build
docker build -t geekai-web:$version -f dockerfile-vue ../
3、将打包的镜像导出,然后在线上导入
# 导出镜像
docker save geekai-api:$version > geekai-api.tar
docker save geekai-web:$version > geekai-web.tar
# 拷贝到线上服务器
scp geekai-api.tar geekai-web.tar root@xxx.xxx.xxx.xxx:/opt
# 然后登录线上服务器
ssh root@xxx.xxx.xxx.xxx
cd /opt
# 导入镜像
docker load < geekai-api.tar
docker load < geekai-web.tar
推送到镜像仓库
如果你觉得每次像上面那样编译,打包,拷贝,导入太过繁琐麻烦,一个比较省事的方案是:直接在本地将镜像推送到自己的镜像服务器,然后在服务端直接拉取下来即可。
我们已经为你准备好了一键编译,打包,推送脚本,在 build/build.sh。 你需要修改几处内容(主要就是把 registry.cn-shenzhen.aliyuncs.com/geekmaster
改成你自镜像仓库的地址):
#!/bin/bash
version=$1
arch=${2:-amd64}
# build go api program
cd ../api
make clean $arch
# build web app
cd ../web
npm run build
cd ../build
# 这里需要把 registry.cn-shenzhen.aliyuncs.com/geekmaster 改成你的镜像仓库的地址,下面相同
docker rmi -f registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-api:$version-$arch
# build docker image for geekai-go
docker build -t registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-api:$version-$arch -f dockerfile-api-go ../
# build docker image for geekai-web
docker rmi -f registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-web:$version-$arch
docker build --platform linux/amd64 -t registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-api-web:$version-$arch -f dockerfile-vue ../
if [ "$3" = "push" ];then
docker push registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-api:$version-$arch
docker push registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-web:$version-$arch
fi
改好之后,你先登录你的 docker 镜像仓库:
docker login --username={你的用户名} {你的镜像仓库服务器地址,如:registry.cn-shenzhen.aliyuncs.com}
准备好了之后,就可以一键编译,打包,推送镜像了:
# v4.0.9 是指版本
# amd64 是你的服务系统架构,可选项: amd64,arm64
# push 是否推送到服务器,如果你只想在本地测试你的镜像,就不传入这个参数
./build.sh v4.0.9 amd64 push
推送成功之后,你就可以在线上拉取你自己打包的镜像了。直接修改 docker-compose.yaml 文件,把 registry.cn-shenzhen.aliyuncs.com/geekmaster
改成你的 docker 镜像仓库地址,然后把v4.0.7改成你本次打包的版本,其他保持不变。
# 后端 API 程序
geekai-api:
image: registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-api:v4.0.7-amd64
container_name: geekai-api
restart: always
depends_on:
- geekai-mysql
- geekai-redis
environment:
- DEBUG=false
- LOG_LEVEL=info
- CONFIG_FILE=config.toml
ports:
- '5678:5678'
- '9999:9999'
volumes:
- /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime
- ./conf/config.toml:/var/www/app/config.toml
- ./logs/app:/var/www/app/logs
- ./static:/var/www/app/static
- ./data/leveldb:/var/www/app/data
# 前端应用
geekai-web:
image: registry.cn-shenzhen.aliyuncs.com/geekmaster/geekai-web:v4.0.7-amd64
container_name: geekai-web
restart: always
depends_on:
- geekai-api
ports:
- '8080:8080'
volumes:
- ./logs/nginx:/var/log/nginx
- ./conf/nginx/conf.d:/etc/nginx/conf.d
- ./conf/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./conf/nginx/ssl:/etc/nginx/ssl
改完之后重启容器,打完,收工 🎉🎉🎉
API 文档
GeekAI 提供了详细的 API 文档,你可以在 https://geekai.apifox.cn 找到。文档会随着功能的变化同步更新。