Appearance
部署服务端
编译
Go 默认静态编译,支持把程序需要的逻辑、依赖全部打包进单个可执行二进制文件。
在编译之前,需要确定一些信息:
config/cors.yaml内配置项目前端的部署域名允许跨域,可参考:常见问题config/config.yaml文件内配置好服务端的数据库连接信息,若还未安装PostgreSQL,此处的官方文档中有各个操作系统下的安装说明- 确定目标服务器的架构,
linux系统可以执行uname -m命令查看(一般是amd/x86_64,少见有arm64)
执行编译命令
bash
# Windows CMD
set CGO_ENABLED=0
set GOOS=linux
set GOARCH=amd64
go build -o ./tmp/aigo-linux-amd64 ./cmd/main.go
# Windows PowerShell
$env:CGO_ENABLED=0;$env:GOOS="linux";$env:GOARCH="amd64"; go build -o ./tmp/aigo-linux-amd64 ./cmd/main.go
# Linux / MacOS
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./tmp/aigo-linux-amd64 ./cmd/main.gobash
# Windows CMD
set CGO_ENABLED=0
set GOOS=linux
set GOARCH=arm64
go build -o ./tmp/aigo-linux-arm64 ./cmd/main.go
# Windows PowerShell
$env:CGO_ENABLED=0;$env:GOOS="linux";$env:GOARCH="arm64"; go build -o ./tmp/aigo-linux-arm64 ./cmd/main.go
# Linux / MacOS
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o ./tmp/aigo-linux-arm64 ./cmd/main.go经过以上编译操作,我们可获得一个单独的二进制文件,它能直接上传运行,比如:./aigo-linux-xxx64;若需先行调试,此时已经可以使用 服务器IP:端口 访问接口了(需要对应端口号已对外开放,默认 8080)。
TIP
- 以上命令需要在项目的根目录执行(
go.mod所在目录) - 编译出来的二进制文件,统一放在
./tmp/目录 - 不同架构的二进制不可混用,架构不匹配执行时一般会报错
exec format error - 查看所有支持的平台/架构可执行
go tool dist list命令
迁移数据
此时如果您服务器上的 PostgreSQL 数据库还未初始化,可以直接使用编译好的二进制执行 ./aigo-linux-xxx64 migrate up 命令迁移数据库(相当于执行 cmd\migrate\migrations 中的所有 SQL,若您本地已有二开但未向 migrations 文件夹添加迁移 SQL,则应该自行同步本地数据库的数据)
部署服务端二进制
部署至生产环境,其实不止是运行二进制,还应该包括:
- 配置开机启动
- 守护进程(进程退出自动重启)
- 指定运行二进制的用户
- 配置 Nginx 反代、SSL证书、绑定域名等
以下提供 宝塔面板站点 和 systemd 服务 两种创建服务的方式。
宝塔面板站点
- 点击网站 > 顶栏选择 Go 项目 > 添加 Go 项目
- 选择之前编译好的二进制文件、项目名称自取,比如:
aigo - 项目端口为
config\config.yaml中配置的server.port端口号,默认8080 - 环境变量可选择指定变量,值填写为:
GIN_MODE=release - 按需填写绑定域名、配置 SSL 证书等
systemd 服务(开机自启、守护进程等)
一、创建 service 文件:
bash
vim /etc/systemd/system/aigo.service二、向 service 文件粘贴以下内容(请自行替换工作目录 / 二进制完整路径):
bash
[Unit]
Description=ai-go-admin
# 以下服务启动后再启动本服务
After=network.target postgresql.service
[Service]
# 工作目录
WorkingDirectory=/www/wwwroot/ask-api.test.com
# 二进制完整路径
ExecStart=/www/wwwroot/ask-api.test.com/aigo-linux-amd64
# 进程退出总是自动重启
Restart=always
# 进程挂掉后,间隔多少秒后重启(设置一定间隔避免程序反复崩溃高频重启打满 CPU)
RestartSec=5
# 指定运行用户,该用户需要对程序二进制、工作目录具备读 / 执行权限
User=www
# 指定环境变量
Environment="GIN_MODE=release"
[Install]
WantedBy=multi-user.target三、常用命令:
bash
# 启动服务
systemctl start aigo
# 查看运行状态(有 Active: active (running) 字样就是运行中)
systemctl status aigo
# 停止服务
systemctl stop aigo
# 重启服务
systemctl restart aigo
# 重载systemd配置
systemctl daemon-reload
# 启用开机自动启动
systemctl enable aigo
# 禁用开机自动启动
systemctl disable aigo
# 看实时日志
journalctl -u aigo -f
# 看最近 200 条日志
journalctl -u aigo -n 200
# 倒序查看日志,最新日志放前面(日常排查更方便)
journalctl -u aigo -r四、绑定域名:
我们通常使用 Nginx 反向代理以上服务,顺便绑定域名、配置 SSL 证书等,以下为 Nginx 示例配置:
bash
server
{
listen 80;
server_name ask-api.test.com;
index index.html index.htm default.htm default.html;
# SSL证书配置开始 >>>
ssl_certificate /etc/nginx/ssl/ask-api.test.com.crt;
ssl_certificate_key /etc/nginx/ssl/ask-api.test.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE‑RSA‑AES128‑GCM‑SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# SSL证书配置结束 <<<
# HTTP反向代理相关配置开始 >>>
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
add_header X-Cache $upstream_cache_status;
proxy_set_header X-Host $host:$server_port;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 30s;
proxy_read_timeout 86400s;
proxy_send_timeout 30s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# HTTP反向代理相关配置结束 <<<
access_log /www/wwwlogs/aigo.log;
error_log /www/wwwlogs/aigo.error.log;
}