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

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

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

Начать курс

Введение: Почему Go идеален для VPS, и что мы будем делать

Go (Golang) — это язык, созданный для масштабируемых и производительных серверных приложений. Компиляция в один статический бинарный файл делает его идеальным кандидатом для деплоя на VPS (Virtual Private Server). Вам не нужно устанавливать интерпретатор или зависимости на сервере — просто скопировали файл и запустили.

В этой статье мы пройдем полный путь: от написания простого HTTP-сервера на Go до его запуска в production на VPS с использованием systemd для автозапуска, Nginx в качестве обратного прокси и Let's Encrypt для HTTPS.

Вы научитесь:

  • Компилировать Go-приложение для Linux
  • Загружать бинарный файл на VPS через SSH
  • Настраивать systemd для автоматического запуска
  • Устанавливать и настраивать Nginx
  • Получать бесплатный SSL-сертификат

Шаг 1: Подготовка Go-приложения и компиляция

Создаем простое веб-приложение

Для примера напишем минимальный HTTP-сервер, который отвечает "Hello, VPS!". Создайте файл main.go:

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, VPS!")
    })

    fmt.Println("Server started on :8080")
    http.ListenAndServe(":8080", nil)
}

Компиляция для Linux

Если вы разрабатываете на Windows или macOS, нужно скомпилировать бинарник для целевой архитектуры VPS (обычно linux/amd64). Откройте терминал в папке с проектом и выполните:

set GOOS=linux
set GOARCH=amd64
go build -o myapp

Для Linux/macOS используйте export:

export GOOS=linux
export GOARCH=amd64
go build -o myapp

В результате появится бинарный файл myapp. Проверьте его размер — он будет небольшим (около 7-10 МБ), так как Go компилирует всё статически.

Шаг 2: Загрузка на VPS и настройка systemd

Подключение к серверу и загрузка файла

Подключитесь к вашему VPS по SSH:

ssh root@ваш-ip-сервера

Создайте директорию для приложения:

mkdir -p /opt/myapp
cd /opt/myapp

На локальной машине загрузите бинарник через SCP (выполните в отдельном терминале):

scp myapp root@ваш-ip-сервера:/opt/myapp/

Вернитесь на сервер и дайте права на выполнение:

chmod +x /opt/myapp/myapp

Создание systemd-сервиса

Чтобы приложение автоматически запускалось при старте системы и перезапускалось при сбоях, создадим юнит systemd. Создайте файл:

nano /etc/systemd/system/myapp.service

Вставьте следующее содержимое:

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

[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/myapp
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Объяснение параметров:

  • User и Group — пользователь, от которого будет запускаться приложение (рекомендуется не root).
  • Restart=on-failure — автоматический перезапуск при падении.
  • RestartSec=5 — пауза перед перезапуском.

Теперь активируем и запускаем сервис:

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

Если всё сделано правильно, вы увидите статус active (running). Проверьте, что приложение отвечает локально:

curl http://localhost:8080

Шаг 3: Настройка Nginx как обратного прокси

Прямой доступ к приложению через порт 8080 небезопасен и неудобен. Nginx будет принимать запросы на 80/443 портах и перенаправлять их на наш Go-сервер.

Установка Nginx

apt update
apt install nginx -y

Создание конфигурации

Создайте файл для вашего домена (или IP):

nano /etc/nginx/sites-available/myapp

Вставьте:

server {
    listen 80;
    server_name ваш-домен.ru;  # или ваш-ip-адрес

    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;
    }
}

Активируйте сайт и перезагрузите Nginx:

ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
nginx -t  # проверка синтаксиса
systemctl reload nginx

Теперь ваше приложение доступно по домену или IP на 80 порту.

Шаг 4: Настройка HTTPS через Let's Encrypt

Без HTTPS современный сайт считается небезопасным. Используем Certbot для автоматического получения сертификата.

Установка Certbot

apt install certbot python3-certbot-nginx -y

Получение сертификата

certbot --nginx -d ваш-домен.ru

Следуйте инструкциям. Certbot автоматически изменит конфигурацию Nginx, добавив блоки для HTTPS. После завершения проверьте:

systemctl status certbot.timer  # автоматическое обновление

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

Блоги

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