引言:从开发到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-plugin2. 使用GitHub Actions和Docker的CI/CD流水线
高级部署意味着自动化。我们将使用GitHub Actions来构建镜像,并通过SSH将其发送到服务器,然后启动新容器。
Go项目的结构:
myapp/├── main.go├── go.mod├── Dockerfile├── docker-compose.yml└── .github/workflows/deploy.ymlDockerfile(多阶段构建):
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