Почему 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?
| Критерий | VPS | Docker | Cloud (PaaS) |
|---|---|---|---|
| Сложность | Средняя | Средняя | Низкая |
| Контроль | Полный | Высокий | Ограниченный |