Go 项目云服务器部署:从交叉编译到服务运行

1. 前言

Go 项目开发完成后,需要部署到 Linux 云服务器运行。

相比其他语言,Go 具有较好的部署优势:

  • 支持交叉编译,可以在 Windows 环境生成 Linux 可执行文件
  • 编译后生成单个二进制文件
  • 不依赖额外运行环境,上传即可运行

本文记录我的 RAG 知识库项目从本地开发到 Linux 云服务器部署的完整流程。


2. Go 项目交叉编译

由于本地开发环境为 Windows,而云服务器通常为 Linux,因此需要进行交叉编译。

编译命令

(这个就在vscode里面的终端就行了)
Windows PowerShell:

1
2
3
4
5
$env:CGO_ENABLED=0
$env:GOOS="linux"
$env:GOARCH="amd64"

go build -o rag main.go

参数说明:

参数 作用
CGO_ENABLED=0 关闭 CGO,生成纯 Go 静态编译程序,减少运行环境依赖
GOOS=linux 指定目标操作系统为 Linux
GOARCH=amd64 指定目标 CPU 架构

编译完成后生成:

1
rag

文件,该文件可以直接上传 Linux 服务器运行。

生成 rag 文件截图


3. 上传服务器并运行

(我使用的是xshell远程连接服务器的,如果不想使用scp上传文件的话,也可以使用xshell相关的工具xftp就行,只要拖动文件就可以了)

上传文件

使用 scp 上传:

1
scp rag root@服务器IP:/opt/rag-knowledge/

服务器目录:

1
2
3
4
5
/opt/rag-knowledge/

├── rag
├── config.yaml
└── .env

添加执行权限

Linux 默认可能没有执行权限:

1
chmod +x rag

运行:

1
./rag

服务器目录和权限截图


4. 云服务器安全组配置

如果项目监听端口:

例如:

1
8080

需要在云服务器控制台开放对应端口。

否则:

  • 程序正常运行
  • 服务器内部可以访问
  • 外网无法连接

配置:

1
2
3
4
5
安全组

入方向规则

开放 TCP 8080

云服务器实例
安全组端口配置

记得ip别填的跟我一样,用你拥有的云服务器ip


5. RAG 知识库项目部署环境

服务器环境:

项目 配置
操作系统 TencentOS (CentOS 系)
项目目录 /opt/rag-knowledge
二进制文件 rag
配置文件 config.yaml
环境变量 .env
服务名称 rag-knowledge

项目依赖:

服务 作用
MySQL 8.0 保存文档信息、聊天记录
Redis Embedding 缓存
Qdrant 向量数据库

整体架构:

1
2
3
4
5
6
7
8
9
10
11
12
               用户请求
|

Go RAG 服务
|
----------------------------
| | |
↓ ↓ ↓
MySQL Redis Qdrant

文档数据 Embedding 向量检索
聊天记录 缓存

6. 使用 systemd 管理 Go 服务

为了让服务支持:

  • 后台运行
  • 开机启动
  • 统一日志管理

使用 systemd 创建服务。

服务名称:

1
rag-knowledge

服务管理命令

启动:

1
sudo systemctl start rag-knowledge

重启:

1
sudo systemctl restart rag-knowledge

停止:

1
sudo systemctl stop rag-knowledge

查看状态:

1
sudo systemctl status rag-knowledge

查看状态

查看实时日志:

1
journalctl -u rag-knowledge -f

查看实时日志

查看最近日志:

1
journalctl -u rag-knowledge -n 50

7. 数据库和依赖服务管理

MySQL

查看状态:

1
sudo systemctl status mysqld

进入数据库:

1
mysql -u root -p

常用操作:

1
2
3
4
5
6
7
8
9
SHOW DATABASES;

USE rag_knowledge;

SHOW TABLES;

SELECT * FROM documents;

SELECT * FROM chat_histories;

Redis

查看:

1
sudo systemctl status redis

Qdrant

Qdrant 使用 Docker 部署。

查看容器:

1
docker ps

查看容器


8. 项目更新流程

当代码修改后,需要重新编译并上传。

1. 本地重新编译

1
2
3
4
set GOOS=linux
set GOARCH=amd64

go build -o rag .

2. 上传服务器

1
scp rag root@服务器IP:/opt/rag-knowledge/

如果修改配置文件:

1
scp config.yaml root@服务器IP:/opt/rag-knowledge/

3. 重启服务

1
sudo systemctl restart rag-knowledge

查看:

1
sudo systemctl status rag-knowledge

9. 修改 systemd 配置

如果修改:

1
/etc/systemd/system/rag-knowledge.service

需要重新加载:

1
sudo systemctl daemon-reload

然后:

1
sudo systemctl restart rag-knowledge

不同修改对应操作:

修改内容 操作
Go代码 重新编译 + 上传 + restart
config.yaml 上传 + restart
.env 上传 + restart
service文件 daemon-reload + restart

10. 总结

Go 项目部署流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
本地开发

Go交叉编译

生成Linux二进制文件

scp上传服务器

chmod添加权限

systemd管理服务

开放安全组端口

公网访问

通过本次部署,完成了 Go 后端项目从本地开发环境到云服务器运行环境的完整流程,包括:

  • Go 交叉编译
  • Linux 文件权限管理
  • systemd 服务管理
  • MySQL/Redis/Qdrant 依赖部署
  • 项目更新维护流程

ps: 只要你不把服务器关机,别人就能一直访问你的项目,但是如果是自己想试一下项目上线部署的过程,可以试玩就关机,下一次重启的时候公网ip地址可能会变。