Skip to main content

Server Setup

Покупка VPS, начальная настройка, SSH-ключи, firewall, swap.


1. Выбор и покупка VPS

Рекомендуемые провайдеры

ПровайдерПлюсыМинусы
HetznerОтличная цена/качество, EU дата-центрыНет РФ локации
DigitalOceanПростой UI, хорошая документацияДороже Hetzner
VultrМного локаций, hourly billing
Timeweb CloudРФ локация, рублёвая оплатаМенее стабилен

Конфигурация сервера

ПараметрЗначение
OSUbuntu 22.04 LTS
CPU4 vCPU (минимум 2)
RAM8 GB (минимум 4 GB + swap)
Disk80 GB SSD (минимум 40 GB)
ЛокацияБлижайшая к целевой аудитории
Ubuntu 22.04 LTS

Dokploy официально поддерживает Ubuntu 22.04. Другие дистрибутивы могут работать, но не гарантируются.

При создании VPS выбери SSH-ключ как метод аутентификации, если провайдер позволяет. Если доступен только вход по паролю — настрой SSH-ключ вручную после первого подключения (см. секцию 10).


2. Создание SSH-ключа

Если у тебя ещё нет SSH-ключа, создай его на своём компьютере (не на сервере):

# Генерация ключа Ed25519 (рекомендуется)
ssh-keygen -t ed25519 -C "your_email@example.com"

# Если Ed25519 не поддерживается — RSA 4096
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

При создании:

  • Путь: оставь по умолчанию (~/.ssh/id_ed25519)
  • Passphrase: задай пароль для дополнительной защиты (рекомендуется)
Где хранится приватный ключ

Приватный ключ должен лежать на том компьютере/системе, откуда ты подключаешься:

Откуда подключаешьсяПуть к ключу
Windows (PowerShell/cmd)C:\Users\ИМЯ\.ssh\id_ed25519
WSL/home/ИМЯ/.ssh/id_ed25519 (или /root/.ssh/ для root)
macOS / Linux~/.ssh/id_ed25519

Если подключаешься и из Windows, и из WSL — ключ нужен в обоих местах, либо используй один источник через симлинк.

# Скопировать публичный ключ
cat ~/.ssh/id_ed25519.pub

Добавление ключа на сервер — зависит от провайдера:

  • Панель VPS поддерживает SSH Keys — вставь содержимое .pub файла при создании VPS (поле SSH Key)
  • Только пароль при создании — после первого входа по паролю добавь ключ вручную:
# На сервере (после входа по паролю):
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "СОДЕРЖИМОЕ_ВАШЕГО_id_ed25519.pub" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

3. Первое подключение

# Подключение по SSH
ssh root@YOUR_SERVER_IP

# Если ключ в нестандартном месте
ssh -i ~/.ssh/my_key root@YOUR_SERVER_IP
Удобный SSH Config

Создай (или дополни) файл config без расширения в папке ~/.ssh/:

ОСПуть к файлу
WindowsC:\Users\ИМЯ\.ssh\config
WSL / macOS / Linux~/.ssh/config
Host goloot
HostName YOUR_SERVER_IP
User root
IdentityFile ~/.ssh/id_ed25519

После этого подключение одной командой: ssh goloot


4. Обновление системы

Сразу после первого входа:

# Обновить пакеты
apt update && apt upgrade -y

# Установить базовые утилиты
apt install -y curl wget git htop nano ufw fail2ban

5. Настройка Firewall (UFW)

Критически важно

Настрой firewall до установки Dokploy. Открытые порты — главная уязвимость.

# Разрешить SSH (чтобы не потерять доступ!)
ufw allow OpenSSH

# Разрешить HTTP и HTTPS (для Traefik)
ufw allow 80/tcp
ufw allow 443/tcp

# Включить firewall
ufw enable

# Проверить статус
ufw status verbose

Ожидаемый вывод:

Status: active

To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere

Что НЕ открывать снаружи

ПортСервисПочему закрыт
5432PostgreSQLДоступ только локально
6379RedisДоступ только локально
3000Dokploy UIВременно откроем при установке
9090PrometheusЧерез Grafana, не напрямую
3030GrafanaЧерез Traefik (по домену)
3100LokiТолько внутренняя сеть
Dokploy UI

Для доступа к Dokploy UI (порт 3000) можно использовать SSH-туннель вместо открытия порта:

# На своём компьютере:
ssh -L 3000:localhost:3000 root@YOUR_SERVER_IP

# Затем в браузере: http://localhost:3000

Или временно открыть порт для первичной настройки домена, потом закрыть.


6. Настройка Fail2Ban

Fail2Ban защищает от brute-force атак на SSH.

Не копируй jail.conf целиком!

Частая ошибка — cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local. Это копирует весь дефолтный конфиг (~980 строк), что затрудняет поддержку.

Файл jail.local должен содержать только твои переопределения. Всё остальное наследуется из jail.conf автоматически.

Создай минимальный /etc/fail2ban/jail.local:

nano /etc/fail2ban/jail.local
[sshd]
enabled = true
maxretry = 3
bantime = 3600
findtime = 600

Параметры port, logpath, filter, backend уже корректно заданы в jail.conf через переменные (например, %(sshd_log)s резолвится в /var/log/auth.log на Ubuntu). Переопределять их не нужно.

ПараметрЗначениеОписание
enabledtrueВключить jail (по умолчанию все выключены)
maxretry3Блокировка после 3 неудачных попыток
bantime3600Бан на 1 час (в секундах)
findtime600Окно наблюдения 10 минут
# Перезапустить
systemctl restart fail2ban
systemctl enable fail2ban

# Проверить статус
fail2ban-client status sshd
Если уже скопировал jail.conf

Если jail.local уже содержит полную копию jail.conf — замени содержимое на минимальный конфиг выше. Или найди секцию [sshd] и добавь в неё enabled = true и нужные параметры.


7. Настройка Swap

Swap — это файл на диске, который система использует как дополнительную «медленную RAM». Когда оперативная память заканчивается, Linux перемещает неиспользуемые данные в swap вместо того, чтобы убивать процессы (OOM killer).

Обязательно при 4 GB RAM

Без swap сборка Docker образов может упасть с OOM killer. При 8 GB RAM тоже рекомендуется.

# Создать swap файл 4 GB
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

# Сделать постоянным (переживёт перезагрузку)
echo '/swapfile none swap sw 0 0' >> /etc/fstab

# Настроить swappiness (использовать swap только при необходимости)
echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p

# Проверить
free -h

Ожидаемый вывод:

              total        used        free      shared  buff/cache   available
Mem: 7.8Gi xxx xxx xxx xxx xxx
Swap: 4.0Gi 0B 4.0Gi

8. Настройка часового пояса

# Установить UTC (рекомендуется для серверов)
timedatectl set-timezone UTC

# Или конкретный часовой пояс
timedatectl set-timezone Europe/Moscow

# Проверить
timedatectl

9. Безопасность: отключение root-пароля

Если VPS был создан с паролем (не SSH-ключом):

# Убедиться, что SSH-ключ работает (НЕ отключай пароль до проверки!)
# С другого терминала:
ssh root@YOUR_SERVER_IP

# Если SSH-ключ работает — отключить вход по паролю
nano /etc/ssh/sshd_config

Найди и измени две строки (по умолчанию они закомментированы с другими значениями):

# Было:                              # Стало:
#PasswordAuthentication yes → PasswordAuthentication no
#PermitRootLogin yes → PermitRootLogin prohibit-password

Убери # в начале строки и замени значение.

# Применить
systemctl restart ssh # На Ubuntu сервис называется "ssh", не "sshd"
Не потеряй доступ!

Перед отключением пароля убедись, что SSH-ключ работает. Проверь из второго терминала. Если потеряешь доступ — восстановление только через консоль VPS провайдера.


10. Чеклист

  • VPS создан (Ubuntu 22.04, 4+ vCPU, 8+ GB RAM, 80+ GB SSD)
  • SSH-ключ настроен и работает
  • Система обновлена (apt update && apt upgrade)
  • Базовые утилиты установлены
  • UFW включён (порты 22, 80, 443)
  • Fail2Ban настроен и работает
  • Swap настроен (4 GB)
  • Часовой пояс установлен
  • Вход по паролю отключён (опционально)