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

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

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

Начать курс

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

Блоги

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