Деплой Go приложения на VPS: пошаговое руководство

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

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

Начать курс

Введение: почему деплой Go приложения на VPS — это просто и эффективно

Go (Golang) славится своей производительностью и простотой. Одним из главных преимуществ языка является компиляция в единый статический бинарник, который не требует установки дополнительных рантаймов на сервере. Это делает деплой Go приложения на VPS невероятно быстрым и надежным. В этой статье мы разберем полный цикл развертывания: от подготовки сервера до настройки reverse proxy и HTTPS. Вы получите готовый чек-лист, который можно использовать для любого Go-проекта.

1. Подготовка VPS и установка необходимого ПО

Перед тем как загружать код, нужно подготовить сервер. Предполагается, что у вас есть VPS с Ubuntu 22.04 или 24.04. Подключитесь через SSH и выполните обновление системы.

sudo apt update && sudo apt upgrade -y

Установка Go на сервер

Хотя Go компилируется в бинарник, на сервере может потребоваться компилятор для сборки. Установим последнюю версию:

wget https://go.dev/dl/go1.22.5.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile

Проверьте установку: go version.

Установка Git и Nginx

Git понадобится для клонирования репозитория, а Nginx — для reverse proxy и статики.

sudo apt install git nginx -y

2. Сборка и запуск Go приложения

Рассмотрим процесс на примере простого HTTP-сервера. Создайте файл main.go:

package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello from Go on VPS!")
}

func main() {
	http.HandleFunc("/", handler)
	fmt.Println("Server started on :8080")
	http.ListenAndServe(":8080", nil)
}

Соберите бинарник для Linux (даже если вы работаете на Windows/Mac):

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

Теперь загрузите бинарник на сервер. Используйте SCP или Rsync:

scp myapp user@your-server-ip:~/

На сервере сделайте файл исполняемым и запустите:

chmod +x ~/myapp
./myapp &

Проверьте работу: curl http://localhost:8080. Если видите "Hello from Go on VPS!" — всё работает.

3. Настройка systemd для автозапуска

Ручной запуск — не лучшая практика. Используем systemd, чтобы приложение запускалось при старте системы и перезапускалось при сбоях.

Создайте файл сервиса:

sudo nano /etc/systemd/system/myapp.service

Вставьте конфигурацию:

[Unit]
Description=Go Application Service
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/home/user
ExecStart=/home/user/myapp
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Замените /home/user на ваш путь. Активируйте и запустите сервис:

sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
sudo systemctl status myapp

Теперь ваше Go приложение будет работать как демон.

4. Настройка Nginx как reverse proxy и HTTPS

Чтобы приложение было доступно по домену и через 443 порт, настроим Nginx.

Конфигурация reverse proxy

Удалите дефолтный конфиг и создайте свой:

sudo rm /etc/nginx/sites-enabled/default
sudo nano /etc/nginx/sites-available/myapp

Добавьте:

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.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/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

Настройка SSL с Let's Encrypt

Установите Certbot и получите сертификат:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

Certbot автоматически обновит конфиг Nginx. Проверьте автообновление:

sudo certbot renew --dry-run

Теперь ваше Go приложение работает по HTTPS.

5. Безопасность и дополнительные советы

  • Запуск от непривилегированного пользователя: В systemd мы указали User=www-data. Никогда не запускайте бинарник от root.
  • Ограничьте порты: Используйте файрвол (ufw): sudo ufw allow 22/tcp && sudo ufw allow 80/tcp && sudo ufw allow 443/tcp && sudo ufw enable.
  • Мониторинг: Добавьте health-check endpoint в ваше приложение и настройте Uptime Kuma или аналоги.
  • Graceful shutdown: Реализуйте обработку сигналов SIGTERM/SIGINT для корректного завершения.

Заключение

Деплой Go приложения на VPS — это прямолинейный процесс, который состоит из четырех основных шагов: подготовка сервера, сборка и загрузка бинарника, настройка systemd и Nginx с HTTPS. Благодаря статической компиляции Go, вы получаете минимальное потребление ресурсов и высокую стабильность. Используйте этот гайд как шаблон для своих проектов — от простых API до микросервисов. Удачного деплоя!

Блоги

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