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

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

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

Начать курс

Введение: почему деплой 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                

Блоги

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