Go в продакшн: VPS, Docker или Cloud — выбираем лучший деплой

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Почему Go — идеальный кандидат для продакшена, но деплой всё равно решает всё

Вы написали бэкенд на Go. Он летает: компиляция в один бинарник, минимальное потребление памяти, горутины, которые не боятся нагрузки. Но есть нюанс: даже самый быстрый код бесполезен, если он лежит мёртвым грузом на локальной машине. Рано или поздно встаёт вопрос: как выкатить это чудо инженерной мысли в продакшн?

Деплой Go-приложений — это не rocket science, но здесь легко наступить на грабли. В этой статье мы разберём три основных пути: классический VPS, контейнеризация с Docker и облачные платформы. Вы узнаете, какой подход выбрать под свою задачу, и получите готовые скрипты для старта.

Деплой Go на VPS: классика, которая не стареет

Виртуальный частный сервер (VPS) — это ваш личный рут. Полный контроль, никаких ограничений платформы, но и ответственность за всё лежит на вас. Для Go-приложения это часто оптимальный вариант: бинарник весит 10–20 МБ, запускается за миллисекунды и не требует сложной оркестрации.

Что нужно для деплоя Go на VPS

  • Сервер с Linux (Ubuntu 22.04 / Debian 11 — классика)
  • SSH-доступ
  • Go (опционально, если компилируете на сервере)
  • Systemd для управления процессом
  • Nginx или Caddy как reverse proxy

Пример: деплой Go-сервера через Systemd

Допустим, у вас есть простое приложение main.go, которое слушает порт 8080. Компилируем его на своей машине под целевую архитектуру:

GOOS=linux GOARCH=amd64 go build -o app main.go

Копируем бинарник на сервер:

scp app user@your-server:/opt/app/

Создаём systemd-юнит в /etc/systemd/system/app.service:

[Unit]
Description=Go App
After=network.target

[Service]
ExecStart=/opt/app/app
WorkingDirectory=/opt/app
Restart=always
User=www-data
Group=www-data
Environment=PORT=8080

[Install]
WantedBy=multi-user.target

Запускаем и включаем автозагрузку:

sudo systemctl daemon-reload
sudo systemctl enable --now app

Теперь ваше Go-приложение работает как демон. Добавляем Nginx для проксирования с 80 порта:

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Плюсы VPS: полный контроль, низкая стоимость (от $5/мес), прозрачность. Минусы: ручное обновление, нет автоскейлинга, нужно самому настраивать безопасность.

Docker для Go: контейнеризация, которая упрощает жизнь

Если вы работаете в команде или планируете микросервисы, Docker — ваш выбор. Go и Docker — идеальная пара: мультистейдж-сборка даёт образы размером 5–15 МБ, а статическая компиляция позволяет обойтись без базового образа.

Dockerfile для Go-приложения

Вот минимальный, но production-ready Dockerfile:

# Stage 1: сборка
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o app .

# Stage 2: минимальный образ
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/app .
EXPOSE 8080
CMD ["./app"]

Собираем и запускаем:

docker build -t go-app .
docker run -d -p 8080:8080 --name go-app go-app

Docker Compose для полноценного стенда

Когда к приложению нужна база данных или Redis, используйте docker-compose.yml:

version: '3.8'
services:
  app:
    build: .
    ports:
      - "8080:8080"
    environment:
      - DB_HOST=db
      - DB_PORT=5432
    depends_on:
      - db
  db:
    image: postgres:16
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

Запуск одной командой: docker compose up -d. Удобно, правда?

Плюсы Docker: воспроизводимость окружения, изоляция, простота масштабирования. Минусы: нужно учить Docker, лишний слой абстракции, на маленьких проектах — overkill.

Облачные платформы: деплой Go без головной боли

Если не хотите возиться с серверами и контейнерами, облачные PaaS-решения — ваш вариант. Go-приложения легко деплоятся на Railway, Fly.io, Heroku (с ограничениями) и AWS App Runner. Они сами управляют инфраструктурой, SSL и масштабированием.

Fly.io: идеальный вариант для Go

Fly.io — это платформа, которая запускает ваш код на серверах рядом с пользователями. Для Go достаточно создать fly.toml:

app = "my-go-app"
primary_region = "ams"

[build]
  builder = "dockerfile"

[http_service]
  internal_port = 8080
  force_https = true

Деплой в одну команду:

flyctl launch
flyctl deploy

Fly.io сам поднимает экземпляры, балансирует нагрузку и обновляет приложение без даунтайма. Для стартапов и пет-проектов — лучшее соотношение цена/удобство.

Railway: ещё проще

Railway умеет деплоить Go через GitHub. Просто подключите репозиторий, укажите команду сборки go build -o app и стартовую команду ./app. Платформа сама определит порт и выдаст URL.

Плюсы облака: минимум действий, автоматические обновления, встроенные метрики. Минусы: цена растёт с нагрузкой (у Fly.io — плата за CPU/RAM), меньше контроля, vendor lock-in.

Сравнение подходов: что выбрать для Go?

Блоги

Рекомендаций по книгам

КритерийVPSDockerCloud (PaaS)
СложностьСредняяСредняяНизкая
КонтрольПолныйВысокийОграниченный