Введение: почему деплой 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 до микросервисов. Удачного деплоя!