在VPS上部署Go应用:高级指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:从开发到Go生产服务器

您已经用Go(Golang)编写了一个高性能的Web应用。编译成单个二进制文件、静态类型、内置网络支持——这些都让它在Node.js或Python面前占尽优势。但“它在我机器上能运行”并不是生产环境的理由。在VPS上高级部署Go应用不仅仅是复制文件到SSH。它涉及配置CI/CD流水线、容器化、反向代理、自动更新证书、监控以及优雅关闭。

在本文中,我们将为Ubuntu 22.04 LTS上的Golang应用解析一个完整的生产就绪方案。您将学习如何配置Docker构建、通过GitHub Actions实现零停机部署、集成Nginx与SSL,并设置Prometheus指标监控。



1. 准备VPS并配置环境

假设您有一台运行Ubuntu 22.04的VPS(DigitalOcean、Hetzner、Timeweb)。首先更新系统并安装基础工具集:

ssh root@your_server_ipapt update && apt upgrade -yapt install -y git curl htop net-tools ufw

创建一个名为deploy的用户,赋予sudo权限(无密码,仅通过SSH密钥登录):

adduser deployusermod -aG sudo deploymkdir /home/deploy/.sshcp ~/.ssh/authorized_keys /home/deploy/.ssh/chown -R deploy:deploy /home/deploy/.sshchmod 700 /home/deploy/.ssh && chmod 600 /home/deploy/.ssh/authorized_keys

配置UFW防火墙:

ufw allow OpenSSHufw allow 80/tcpufw allow 443/tcpufw enable

重要: 在/etc/ssh/sshd_config中禁用root登录(PermitRootLogin no),然后重启SSH(systemctl restart sshd)。



1.1 安装Docker和Docker Compose

对于Go应用,容器化是事实上的标准。按照官方说明安装Docker:

curl -fsSL https://get.docker.com -o get-docker.shsh get-docker.shusermod -aG docker deploy

检查版本:docker --version。接下来安装Docker Compose v2(插件):

apt install -y docker-compose-plugin


2. 使用GitHub Actions和Docker的CI/CD流水线

高级部署意味着自动化。我们将使用GitHub Actions来构建镜像,并通过SSH将其发送到服务器,然后启动新容器。

Go项目的结构:

myapp/├── main.go├── go.mod├── Dockerfile├── docker-compose.yml└── .github/workflows/deploy.yml

Dockerfile(多阶段构建):

FROM golang:1.22-alpine AS builderWORKDIR /appCOPY go.mod go.sum ./RUN go mod downloadCOPY . .RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /app/myapp .

FROM alpine:latestRUN apk --no-cache add ca-certificates tzdataWORKDIR /root/COPY --from=builder /app/myapp .EXPOSE 8080CMD ["./myapp"]

docker-compose.yml(用于生产环境):

version: '3.8'services:  app:    image: ghcr.io/your_username/myapp:latest    restart: always    ports:      - "127.0.0.1:8080:8080"    environment:      - DB_URL=postgres://user:pass@db:5432/mydb    depends_on:      - db  db:    image: postgres:16-alpine    restart: always    environment:      POSTGRES_USER: user      POSTGRES_PASSWORD: pass    volumes:      - pg_data:/var/lib/postgresql/datavolumes:  pg_data:

GitHub Actions工作流(.github/workflows/deploy.yml):

name: Deploy Go Appon:  push:    branches: [ main ]jobs:  build-and-deploy:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4      - name: Login to GitHub Container Registry        uses: docker/login-action@v3        with:          registry: ghcr.io                

博客

书籍推荐