golang 应用服务端部署(使用 systemd 服务)

ai-go-admin 开源后台系统的服务端部署文档(使用 systemd )供大家参考。

编译

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

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

  1. config/cors.yaml 内配置项目前端的部署域名允许跨域,可参考:常见问题
  2. config/config.yaml 文件内配置好服务端的数据库连接信息,若还未安装 PostgreSQL,此处的官方文档中有各个操作系统下的安装说明
  3. 确定目标服务器的架构,linux 系统可以执行 uname -m 命令查看(一般是 amd/x86_64,少见有 arm64)

执行编译命令

AMD64
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
ARM64
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)。

  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;
}
相关推荐
龙腾AI白云15 小时前
AI检索增强生成(RAG):解决大模型幻觉的核心落地技术
数据库·人工智能·机器学习·知识图谱
云票15 小时前
企业对接AI合同审查系统的工程实践
人工智能
admin and root16 小时前
「AI安全篇」实战AntiDebug自动化JS逆向加解密MCP
javascript·人工智能·网络安全·自动化·漏洞挖掘·cnvd·src赏金
智能RPA16 小时前
智能体自动化平台与主数据管理平台(MDM)对比评测
人工智能·自动化·agent·rpa
一条小小yu16 小时前
Spring IoC的理解
java·后端·spring
跨境小彭16 小时前
Temu拉美站点铺货实操复盘:手动复制痛点与批量自动化解决方案
服务器·人工智能·搜索引擎·自动化·temu电商运营
落魄实习生16 小时前
Agent Scope Java 2.x 系列【7】工具使用
java·开发语言·ai
封印师请假去地球钓鱼16 小时前
边解边变的问题:从“决策依赖“一词出发
人工智能·算法
AI搅拌机17 小时前
ComfyUI管理大师:安全稳定升级+切换指定版本!
人工智能
茉莉玫瑰花茶17 小时前
GO [ 方法 ]
开发语言·后端·golang