VPS для Go-приложений: от сборки до systemd и nginx
Go компилируется в один статический бинарник без рантайма — это делает деплой на VPS предельно простым. Разберём весь путь: сборка, запуск под systemd, nginx как reverse proxy и TLS.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Почему Go идеально ложится на VPS
Главное преимущество Go — статическая компиляция. Готовый бинарник не тянет за собой интерпретатор, виртуальную машину или пакеты зависимостей на сервере. Вы собираете один файл и просто копируете его на VPS.
Это снимает целый класс проблем: не нужно ставить рантайм нужной версии, конфликтов библиотек не возникает, а потребление памяти обычно измеряется десятками мегабайт. Даже на младшем тарифе Go-сервис чувствует себя свободно.
- Один бинарник — нет зависимостей на хосте.
- Низкое потребление RAM — хватает 1 ГБ на большинство API.
- Быстрый старт — процесс поднимается за миллисекунды.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для GoПодготовка сервера
Обновляем систему и ставим базовый набор. Go на самом сервере нужен, только если вы собираете прямо на VPS; чаще бинарник кросс-компилируют локально.
sudo apt update && sudo apt upgrade -y
sudo apt install -y nginx git ufw
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
Заведём отдельного пользователя для приложения — не запускайте сервис от root.
sudo useradd -r -s /usr/sbin/nologin appuser
sudo mkdir -p /opt/goapp
sudo chown appuser:appuser /opt/goapp
Сборка бинарника
Собирать удобно локально с отключённым CGO — так бинарник получается полностью статическим и переносимым на любой Linux-хост.
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o goapp ./cmd/server
Флаги -s -w убирают отладочную информацию и уменьшают размер. Копируем результат на сервер:
scp goapp appuser@SERVER_IP:/opt/goapp/goapp
ssh appuser@SERVER_IP 'chmod +x /opt/goapp/goapp'
Запуск под systemd
systemd сам перезапустит упавший процесс и поднимет сервис после ребута. Создаём unit-файл:
sudo nano /etc/systemd/system/goapp.service
[Unit]
Description=Go application
After=network.target
[Service]
User=appuser
WorkingDirectory=/opt/goapp
ExecStart=/opt/goapp/goapp
Restart=always
RestartSec=3
Environment=PORT=8080
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now goapp
sudo systemctl status goapp
Логи смотрим через journalctl: journalctl -u goapp -f. Параметр Restart=always гарантирует, что процесс поднимется после падения, а RestartSec=3 задаёт паузу перед перезапуском, чтобы не уйти в бесконечный цикл при системной ошибке.
Для передачи секретов в приложение удобно использовать отдельный файл окружения. systemd подхватит его директивой EnvironmentFile, а сам файл держите с правами 600, чтобы переменные не читались посторонними.
echo 'DATABASE_URL=postgres://localhost/app' | sudo tee /opt/goapp/goapp.env
sudo chmod 600 /opt/goapp/goapp.env
sudo chown appuser:appuser /opt/goapp/goapp.env
# в unit: EnvironmentFile=/opt/goapp/goapp.env
nginx как reverse proxy и TLS
Приложение слушает 127.0.0.1:8080, наружу его проксирует nginx. Это даёт TLS, отдачу статики и защиту порта приложения.
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
sudo ln -s /etc/nginx/sites-available/goapp /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com
Где брать сервер и частые ошибки
Go отлично раскрывается на процессорах с высокой производительностью на ядро. На тарифах MAATRIX это AMD EPYC + NVMe — компиляция и обработка запросов идут заметно быстрее, а локации UK, США и РФ дают низкий пинг для зарубежной аудитории. Оплата картой РФ, СБП, криптой или токеном MAAT — удобно, когда иностранные провайдеры карты не принимают.
- Забыли CGO_ENABLED=0 — бинарник требует glibc нужной версии и падает.
- Сервис от root — лишний риск; используйте отдельного пользователя.
- Нет Restart=always — после падения приложение не поднимется.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для GoОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Нужно ли ставить Go на сам VPS?
Нет, если вы собираете бинарник локально или в CI. На сервер достаточно скопировать готовый статический файл.
Сколько RAM нужно Go-приложению?
Большинству API и веб-сервисов хватает 1 ГБ. Go экономно расходует память, тяжёлые нагрузки требуют больше под кэши и соединения.
Как обновлять приложение без простоя?
Скопируйте новый бинарник, затем выполните systemctl restart goapp. Для zero-downtime используйте сокет-активацию или балансировку двух инстансов.