|
3 روز پیش | |
---|---|---|
api | 3 روز پیش | |
cmd | 3 روز پیش | |
config | 6 روز پیش | |
deploy | 3 هفته پیش | |
docs | 1 سال پیش | |
internal | 3 روز پیش | |
pkg | 4 روز پیش | |
scripts | 2 سال پیش | |
storage | 1 ماه پیش | |
test | 2 هفته پیش | |
web | 3 روز پیش | |
.dockerignore | 2 سال پیش | |
.gitattributes | 2 سال پیش | |
.gitignore | 1 سال پیش | |
GEMINI.md | 5 روز پیش | |
LICENSE | 2 سال پیش | |
Makefile | 1 سال پیش | |
README.md | 3 ماه پیش | |
claude.md | 5 روز پیش | |
go.mod | 4 روز پیش | |
go.sum | 4 روز پیش |
本文档提供在宝塔Linux服务器上部署此Go项目的详细步骤。项目支持同时部署API服务和Task任务服务。
从项目结构和Dockerfile看,项目已经准备好了Docker化部署,这是最简单的方式:
git clone 您的仓库地址 /www/wwwroot/go_project
cd /www/wwwroot/go_project
执行构建命令:
docker build -t go-app:v1 -f deploy/build/Dockerfile .
// docker build -t go-app:v1 --build-arg APP_RELATIVE_PATH=./cmd/server/... -f deploy/build/Dockerfile .
项目提供了优化的部署脚本,支持同时部署API服务和Task任务服务,并且可以显著提高构建速度:
# 将脚本权限设置为可执行
chmod +x deploy/deploy.sh
# 默认部署全部服务(API和Task)
./deploy/deploy.sh
# 只部署API服务
./deploy/deploy.sh --api
# 只部署Task服务
./deploy/deploy.sh --task
# 强制重新创建容器
./deploy/deploy.sh --force
# 不使用Docker缓存构建
./deploy/deploy.sh --no-cache
脚本会自动:
如果您想手动管理容器,可以使用以下命令:
# API服务
docker run -d --restart=always --name nunu-api -p 8000:8000 -v /www/wwwroot/nunu/storage:/data/app/storage -v /www/wwwroot/nunu/config:/data/app/config nunu-api:v1
# Task服务
docker run -d --restart=always --name nunu-task -v /www/wwwroot/nunu/storage:/data/app/storage -v /www/wwwroot/nunu/config:/data/app/config nunu-task:v1
# 停止容器
docker stop go-app
# 启动已停止的容器
docker start go-app
# 重启容器
docker restart go-app
# 查看容器日志
docker logs go-app
# 查看正在运行的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 删除容器(需要先停止)
docker rm go-app
http://127.0.0.1:8000
如果不想使用Docker,也可以直接在服务器上编译运行:
或通过SSH手动安装:
wget https://golang.org/dl/go1.19.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
source ~/.profile
mkdir -p /www/wwwroot/go_project
cd /www/wwwroot/go_project
# 上传您的代码到这个目录
export GOPROXY=https://goproxy.cn,direct
go mod tidy
go build -o bin/server ./cmd/server/...
cp -r config bin/
创建systemd服务文件以便管理应用:
cat > /etc/systemd/system/go-app.service << EOF
[Unit]
Description=Go Application Service
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/www/wwwroot/go_project/bin
ExecStart=/www/wwwroot/go_project/bin/server
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable go-app
systemctl start go-app
http://127.0.0.1:8000
如果在构建Docker镜像时遇到如下错误:
invalid go version '1.23.0': must match format 1.23
unknown directive: toolchain
或者:
go: go.mod requires go >= 1.23.0 (running go 1.22.12; GOTOOLCHAIN=local)
这是因为Dockerfile使用的Go版本与go.mod中声明的版本不匹配。有两种解决方案:
修改deploy/build/Dockerfile
文件,将:
FROM ${REGISTRY}/golang:1.19-alpine AS builder
更改为:
FROM ${REGISTRY}/golang:1.24-alpine AS builder
如果无法更新Docker环境中的Go版本,可以修改go.mod文件:
go 1.23.0
更改为go 1.19
toolchain go1.24.1
行如果遇到这样的错误:
go: cannot write multiple packages to non-directory ./bin/server
或
go: cannot write multiple packages to non-directory ./bin/server/main
或
go: cannot write multiple packages to non-directory ./bin/app
这是因为./cmd/server/...
路径下包含了多个包(main包和wire包),但编译命令在尝试将它们编译到一个单一文件。
需要修改Dockerfile中的以下内容:
将:
RUN rm -rf /data/app/bin/
RUN export GOPROXY=https://goproxy.cn,direct && go mod tidy && go build -ldflags="-s -w" -o ./bin/server ${APP_RELATIVE_PATH}
更改为(指定具体的main.go文件而不是整个目录):
RUN mkdir -p /data/app/bin/
RUN export GOPROXY=https://goproxy.cn,direct && go mod tidy && go build -ldflags="-s -w" -o ./bin/app ./cmd/server/main.go
同时需要更新ENTRYPOINT:
ENTRYPOINT [ "./server" ]
更改为:
ENTRYPOINT [ "./app" ]
这种方法的关键是直接指定main.go文件而不是使用通配符,这样就只编译单个入口文件,避免了多包编译问题。
部署完成后,您可以通过以下方式验证服务是否正常运行:
http://您的服务器IP:8000
检查API是否正常响应http://您的服务器IP:8000/swagger/index.html
查看API文档如遇到问题,请检查:
docker logs go-app
或 journalctl -u go-app