Введение: почему деплой Go приложения на VPS — это просто и надежно
Go (Golang) — один из самых эффективных языков для создания серверных приложений. Его главное преимущество — компиляция в один статический бинарник, который не требует установки интерпретатора или виртуальной машины на сервере. Это делает деплой Go приложения на VPS (Virtual Private Server) невероятно простым и быстрым по сравнению с Python, Node.js или Java.
В этой статье мы шаг за шагом развернем Go-приложение на VPS: от начальной настройки сервера до запуска через systemd и публикации через Nginx с HTTPS. Вы узнаете, как минимизировать риски и обеспечить стабильную работу вашего сервиса 24/7.
1. Подготовка VPS и установка необходимого ПО
Перед началом деплоя убедитесь, что у вас есть доступ к VPS (например, Ubuntu 22.04 LTS) по SSH. Мы будем использовать базовый набор инструментов.
1.1. Первичная настройка сервера
Подключитесь к серверу и выполните обновление пакетов:
ssh root@ваш-ip-сервера
apt update && apt upgrade -y
Создайте отдельного пользователя для приложения (не работайте под root):
adduser deployer
usermod -aG sudo deployer
su - deployer
1.2. Установка Go (если нужно компилировать на сервере)
Хотя чаще всего бинарник собирают локально, иногда удобно компилировать прямо на VPS. Установите последнюю версию Go:
wget https://go.dev/dl/go1.22.2.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.22.2.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
go version
1.3. Установка Git и Nginx
Git понадобится для клонирования репозитория, а Nginx — для обратного прокси и SSL:
sudo apt install git nginx -y
2. Сборка Go приложения и подготовка к деплою
2.1. Пример простого Go-приложения
Создадим минимальный HTTP-сервер на Go. Вы можете использовать свой проект, но для демонстрации подойдет этот код (main.go):
package main
import (
"fmt"
"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, "Hello from Go! Server time: %s", time.Now().Format(time.RFC1123))
})
fmt.Printf("Server starting on port %s\n", port)
http.ListenAndServe(":"+port, nil)
}
2.2. Компиляция бинарника для Linux
На вашей локальной машине (или на сервере) соберите бинарник под целевую архитектуру VPS (обычно amd64):
GOOS=linux GOARCH=amd64 go build -o myapp main.go
Проверьте, что бинарник статический и не требует библиотек:
ldd myapp # Должен вывести "not a dynamic executable"
2.3. Загрузка на сервер
Скопируйте бинарник на VPS через SCP:
scp myapp deployer@ваш-ip-сервера:/home/deployer/
На сервере переместите его в подходящую директорию и дайте права на выполнение:
sudo mkdir -p /opt/myapp
sudo mv /home/deployer/myapp /opt/myapp/
sudo chmod +x /opt/myapp/myapp
3. Настройка systemd для автозапуска и мониторинга
systemd — стандартный менеджер служб в Linux. Он позволит вашему приложению запускаться при старте системы и автоматически перезапускаться при сбоях.
3.1. Создание unit-файла
Создайте файл /etc/systemd/system/myapp.service:
sudo nano /etc/systemd/system/myapp.service
Вставьте следующую конфигурацию:
[Unit]
Description=My Go Application
After=network.target
[Service]
Type=simple
User=deployer
Group=deployer
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/myapp
Restart=always
RestartSec=5
Environment=PORT=8080
[Install]
WantedBy=multi-user.target
3.2. Запуск и проверка службы
Выполните команды для перезагрузки systemd и запуска приложения:
sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl enable myapp
sudo systemctl status myapp
Проверьте, что приложение отвечает локально:
curl http://localhost:8080
4. Настройка Nginx как обратного прокси и HTTPS
Nginx будет принимать запросы из интернета, перенаправлять их на ваше Go-приложение и обеспечивать SSL-терминацию.
4.1. Базовая конфигурация Nginx
Создайте конфигурационный файл для вашего домена (или IP):
sudo nano /etc/nginx/sites-available/myapp
Пример настройки (замените your-domain.com на ваш домен):
server {
listen 80;
server_name your-domain.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
4.2. Установка SSL-сертификата с Let's Encrypt
Для HTTPS используйте Certbot:
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d