Skip to content

部署服务端

编译

Go 默认静态编译,支持把程序需要的逻辑、依赖全部打包进单个可执行二进制文件

在编译之前,需要确定一些信息:

  1. config/cors.yaml 内配置项目前端的部署域名允许跨域,可参考:常见问题
  2. config/config.yaml 文件内配置好服务端的数据库连接信息,若还未安装 PostgreSQL此处的官方文档中有各个操作系统下的安装说明
  3. 确定目标服务器的架构,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.go
bash
# 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

  1. 以上命令需要在项目的根目录执行(go.mod 所在目录)
  2. 编译出来的二进制文件,统一放在 ./tmp/ 目录
  3. 不同架构的二进制不可混用,架构不匹配执行时一般会报错 exec format error
  4. 查看所有支持的平台/架构可执行 go tool dist list 命令

迁移数据

此时如果您服务器上的 PostgreSQL 数据库还未初始化,可以直接使用编译好的二进制执行 ./aigo-linux-xxx64 migrate up 命令迁移数据库(相当于执行 cmd\migrate\migrations 中的所有 SQL,若您本地已有二开但未向 migrations 文件夹添加迁移 SQL,则应该自行同步本地数据库的数据)

部署服务端二进制

部署至生产环境,其实不止是运行二进制,还应该包括:

  • 配置开机启动
  • 守护进程(进程退出自动重启)
  • 指定运行二进制的用户
  • 配置 Nginx 反代、SSL证书、绑定域名等

以下提供 宝塔面板站点systemd 服务 两种创建服务的方式。

宝塔面板站点

  1. 点击网站 > 顶栏选择 Go 项目 > 添加 Go 项目
  2. 选择之前编译好的二进制文件、项目名称自取,比如: aigo
  3. 项目端口为 config\config.yaml 中配置的 server.port 端口号,默认 8080
  4. 环境变量可选择指定变量,值填写为: GIN_MODE=release
  5. 按需填写绑定域名、配置 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;
}