Server Setup
Покупка VPS, начальная настройка, SSH-ключи, firewall, swap.
1. Выбор и покупка VPS
Рекомендуемые провайдеры
| Провайдер | Плюсы | Минусы |
|---|---|---|
| Hetzner | Отличная цена/качество, EU дата-центры | Нет РФ локации |
| DigitalOcean | Простой UI, хорошая документация | Дороже Hetzner |
| Vultr | Много локаций, hourly billing | — |
| Timeweb Cloud | РФ локация, рублёвая оплата | Менее стабилен |
Конфигурация сервера
| Параметр | Значение |
|---|---|
| OS | Ubuntu 22.04 LTS |
| CPU | 4 vCPU (минимум 2) |
| RAM | 8 GB (минимум 4 GB + swap) |
| Disk | 80 GB SSD (минимум 40 GB) |
| Локация | Ближайшая к целевой аудитории |
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
Создай (или дополни) файл config без расширения в папке ~/.ssh/:
| ОС | Путь к файлу |
|---|---|
| Windows | C:\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
Что НЕ открывать снаружи
| Порт | Сервис | Почему закрыт |
|---|---|---|
| 5432 | PostgreSQL | Доступ только локально |
| 6379 | Redis | Доступ только локально |
| 3000 | Dokploy UI | Временно откроем при установке |
| 9090 | Prometheus | Через Grafana, не напрямую |
| 3030 | Grafana | Через Traefik (по домену) |
| 3100 | Loki | Только внутренняя сеть |
Для доступа к Dokploy UI (порт 3000) можно использовать SSH-туннель вместо открытия порта:
# На своём компьютере:
ssh -L 3000:localhost:3000 root@YOUR_SERVER_IP
# Затем в браузере: http://localhost:3000
Или временно открыть порт для первичной настройки домена, потом закрыть.
6. Настройка Fail2Ban
Fail2Ban защищает от brute-force атак на SSH.
Частая ошибка — 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). Переопределять их не нужно.
| Параметр | Значение | Описание |
|---|---|---|
enabled | true | Включить jail (по умолчанию все выключены) |
maxretry | 3 | Блокировка после 3 неудачных попыток |
bantime | 3600 | Бан на 1 час (в секундах) |
findtime | 600 | Окно наблюдения 10 минут |
# Перезапустить
systemctl restart fail2ban
systemctl enable fail2ban
# Проверить статус
fail2ban-client status sshd
Если jail.local уже содержит полную копию jail.conf — замени содержимое на минимальный конфиг выше. Или найди секцию [sshd] и добавь в неё enabled = true и нужные параметры.
7. Настройка Swap
Swap — это файл на диске, который система использует как дополнительную «медленную RAM». Когда оперативная память заканчивается, Linux перемещает неиспользуемые данные в swap вместо того, чтобы убивать процессы (OOM killer).
Без 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)
- Часовой пояс установлен
- Вход по паролю отключён (опционально)
Related
- Deployment Overview — общая карта
- Dokploy Installation — следующий шаг