Go 项目部署到 VPS 的关键步骤是:确认目标系统和 CPU 架构、构建对应的程序、把程序与配置安全地放到服务器、再由进程管理器负责启动和重启。下面以 Linux 和 systemd 为例;如果服务器使用其他 init 系统,服务管理命令需要相应调整。

服务器还没准备好?先看 Vultr 新手上机指南 开一台并完成 SSH、防火墙等基础配置,再回来继续。
1. 确认目标环境
在服务器上查看 CPU 架构:
uname -m
常见的 x86_64 对应 Go 的 amd64,aarch64 对应 arm64。同时确认服务器的 Linux 发行版、Go 项目的最低运行要求,以及程序是否依赖 CGO 或系统动态库。跨平台构建参数必须与目标机器匹配;如果无法确定依赖情况,可以直接在同架构的构建环境中编译。
2. 在本地构建程序
在包含 go.mod 的项目目录下,按目标架构构建:
mkdir -p dist
GOOS=linux GOARCH=amd64 go build -o dist/app ./cmd/server
这里假定项目的主包在 ./cmd/server;按仓库实际路径修改。若主包位于模块根目录,可改为 .。把 GOARCH 改成服务器的架构。CGO 项目还需要匹配目标系统的 C 编译器和动态库;不要在未确认兼容性时直接设置 CGO_ENABLED=0。
Go 官方文档说明,go build 会编译包及其依赖,但不会把构建结果安装到系统路径:编译和安装 Go 程序。
3. 复制程序和配置
使用你信任的 SSH/SFTP 工具把二进制文件放到服务器的应用目录,例如 /opt/example-app/app。为应用创建独立的系统用户,并确保该用户只能读取运行所需文件。
配置文件和密钥不要提交到公开仓库,也不要放进网页目录。若使用环境文件,例如 /etc/example-app.env,请限制读取权限,并且不要把真实密钥粘贴到命令历史或日志里。
4. 创建 systemd unit
在使用 systemd 的发行版上,可以创建 /etc/systemd/system/example-app.service:
[Unit]
Description=Example Go application
After=network.target
[Service]
Type=simple
User=example-app
Group=example-app
WorkingDirectory=/opt/example-app
EnvironmentFile=/etc/example-app.env
ExecStart=/opt/example-app/app
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
按实际账户、路径和启动参数修改文件。应用最好以非 root 用户运行;如果服务不需要读写工作目录,可以进一步限制权限。systemd 的 unit 文件选项和服务生命周期可查阅 systemd.service 官方手册。
保存后重新加载并启动:
sudo systemctl daemon-reload
sudo systemctl enable --now example-app
sudo systemctl status example-app
enable --now 会同时设置开机启动并立即尝试启动服务。如果服务启动失败,先看状态和日志:
sudo journalctl -u example-app --since today
重点检查程序路径、文件权限、环境变量、端口占用和程序本身的启动日志。
5. 再配置入口和监控
应用可只监听本机回环地址,再由 Nginx、Caddy 等反向代理接收公网 HTTP/HTTPS 请求。防火墙只开放确实需要的端口。不要在未配置 TLS、访问控制和日志策略的情况下,把管理接口直接暴露到公网。
上线后观察应用日志、CPU、内存、磁盘和网络流量。验证一次进程重启和数据恢复流程,再把部署步骤、配置位置与回滚方式写进项目运维文档。跑业务之前,建议按安全加固清单把服务器再收紧一遍。
上线前核对
- 构建目标与服务器架构一致,程序在服务器上能启动。
- 服务使用专用低权限账户,密钥保存在受控位置。
- systemd 服务开机启动,失败时能从日志定位原因。
- 公网入口经过反向代理和防火墙规则控制。
- 数据备份存放在服务器之外,并实际验证过恢复。