Введение: почему Go и VPS — идеальная пара для вашего проекта
Go (Golang) — это компилируемый язык, созданный для производительности и простоты. Его главное преимущество при деплое — статическая компиляция. Вам не нужно устанавливать интерпретатор или виртуальную машину на сервере. Вы просто загружаете один бинарный файл и запускаете его. Это делает деплой Go приложения на VPS невероятно быстрым и надежным.
В этом руководстве мы пройдем полный путь: от написания простого HTTP-сервера на Go до его запуска на реальном VPS-сервере под управлением Ubuntu 22.04. Мы настроим systemd для автоматического запуска, Nginx в качестве обратного прокси и Let's Encrypt для HTTPS. Все примеры кода готовы к использованию.
1. Подготовка VPS и написание Go-приложения
1.1. Начальная настройка сервера
После покупки VPS (например, у DigitalOcean, Timeweb или Hetzner) подключитесь по SSH:
ssh root@ваш_IP_сервера
Выполните базовую настройку безопасности:
apt update && apt upgrade -y
adduser deployer
usermod -aG sudo deployer
# Отключите вход для root в /etc/ssh/sshd_config
# PermitRootLogin no
systemctl restart sshd
Убедитесь, что порты 80 и 443 открыты в файрволе (UFW):
ufw allow 22
ufw allow 80
ufw allow 443
ufw enable
1.2. Простое Go-приложение для деплоя
Создайте на своей локальной машине файл main.go:
package main
import (
"fmt"
"log"
"net/http"
"os"
)
func main() {
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Привет из Go! Сервер работает на порту %s", port)
})
http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte("OK"))
})
log.Printf("Запуск сервера на :%s", port)
log.Fatal(http.ListenAndServe(":"+port, nil))
}
Проверьте локально:
go run main.go
Откройте браузер по адресу http://localhost:8080. Если видите приветствие — всё работает.
2. Сборка и загрузка бинарника на сервер
2.1. Кросс-компиляция для Linux
На вашей локальной машине (даже если у вас Windows или macOS) выполните:
GOOS=linux GOARCH=amd64 go build -o myapp main.go
Флаг -o myapp задает имя выходного файла. Переменные окружения GOOS и GOARCH указывают целевую архитектуру (64-битный Linux).
После сборки у вас появится бинарный файл myapp размером около 10–15 МБ.
2.2. Загрузка на VPS
Используйте scp для копирования файла:
scp myapp deployer@ваш_IP_сервера:/home/deployer/myapp
Или, если вы используете rsync:
rsync -avz myapp deployer@ваш_IP_сервера:/home/deployer/myapp
На сервере переместите бинарник в системную директорию и сделайте его исполняемым:
sudo mv /home/deployer/myapp /usr/local/bin/myapp
sudo chmod +x /usr/local/bin/myapp
3. Настройка systemd и автоматического запуска
3.1. Создание service-файла
Systemd будет управлять нашим приложением: запускать при старте системы, перезапускать при падении и собирать логи.
Создайте файл /etc/systemd/system/myapp.service:
sudo nano /etc/systemd/system/myapp.service
Вставьте следующую конфигурацию:
[Unit]
Description=Go Application Server
After=network.target
[Service]
Type=simple
User=deployer
Group=deployer
WorkingDirectory=/usr/local/bin
ExecStart=/usr/local/bin/myapp
Restart=always
RestartSec=5
Environment=PORT=8080
Environment=GIN_MODE=release
[Install]
WantedBy=multi-user.target
Объяснение параметров:
After=network.target— запускаем после поднятия сети.Restart=always— автоматический перезапуск при ошибке.Environment=PORT=8080— передаем переменные окружения приложению.
3.2. Запуск и проверка
Выполните команды:
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
sudo systemctl status myapp
Если статус показывает active (running) — всё отлично. Проверьте, что приложение слушает порт:
curl http://localhost:8080
Вы должны увидеть ответ: "Привет из Go! Сервер работает на порту 8080".
4. Настройка Nginx и HTTPS (SSL)
4.1. Установка Nginx
sudo apt install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx
4.2. Конфигурация обратного прокси
Создайте файл конфигурации для вашего домена (например, example.com):
sudo nano /etc/nginx/sites-available/myapp
Вставьте:
server {
listen 80;
server_name example.com www.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;
}
location /health {
proxy_pass http://127.0.0.1:808