Введение: Почему 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-приложение работает