Полное руководство по настройке VPS на Contabo (Ubuntu 24.04 LTS) и развертыванию безопасной Docker-инфраструктуры
Краткое содержание (TLDR): Исчерпывающая пошаговая инструкция по настройке чистого виртуального выделенного сервера (VPS/VDS) на базе Ubuntu 24.04 LTS. В руководстве подробно описан процесс защиты сервера (настройка SSH-ключей, UFW, Fail2ban), установка Docker и развертывание изолированной инфраструктуры через Обратный прокси (Nginx Proxy Manager) с автоматическим выпуском бесплатных SSL-сертификатов Let’s Encrypt и защитой через Cloudflare.
Введение: Подготовка к работе с сервером
После покупки виртуального сервера (например, на хостинге Contabo), вы получаете его публичный IP-адрес и пароль суперпользователя (root). Базовое управление выполняется по протоколу SSH через командную строку (Terminal в macOS/Linux или PowerShell в Windows).
Часть 1. Первое подключение по SSH и решение конфликтов ключей
1.1 Как исправить ошибку «REMOTE HOST IDENTIFICATION HAS CHANGED»
Если выданный вам IP-адрес ранее использовался на вашем компьютере для подключения к другой операционной системе, SSH-клиент заблокирует вход и выдаст предупреждение о возможной атаке (man-in-the-middle).
Чтобы сбросить кэш ключей в Windows, выполните в PowerShell команду:
ssh-keygen -R <IP_адрес_сервера>
Пример использования: ssh-keygen -R 161.97.156.44
1.2 Первичная авторизация по паролю root
Для первого входа на сервер используйте следующую команду:
ssh root@<IP_адрес_сервера>
Система запросит подтверждение доверия новому хосту — напишите yes. Затем вставьте пароль root, полученный в приветственном письме от хостинг-провайдера (внимание: в целях безопасности вводимые символы пароля в консоли Linux не отображаются).
Часть 2. Создание sudo-пользователя и делегирование прав
Постоянная работа под учетной записью root считается критической уязвимостью. Правильный подход — создание обычного пользователя с возможностью временного повышения привилегий с помощью утилиты sudo.
2.1 Создание нового пользователя Linux
Выполните команду добавления пользователя:
adduser <имя_пользователя>
Задайте надежный пароль и обязательно запомните его — он будет запрашиваться при выполнении административных команд. Заполнение контактных данных (Full Name и т.д.) можно пропустить клавишей Enter.
2.2 Наделение правами администратора (группа sudo)
Добавьте нового пользователя в системную группу администраторов sudo:
usermod -aG sudo <имя_пользователя>
2.3 Перенос публичного SSH-ключа
Для безопасной авторизации скопируйте ваш публичный SSH-ключ в директорию нового пользователя и назначьте правильные права доступа (permissions):
mkdir -p /home/<имя_пользователя>/.ssh
cp ~/.ssh/authorized_keys /home/<имя_пользователя>/.ssh/
chown -R <имя_пользователя>:<имя_пользователя> /home/<имя_пользователя>/.ssh
chmod 700 /home/<имя_пользователя>/.ssh
chmod 600 /home/<имя_пользователя>/.ssh/authorized_keys
Часть 3. Жесткая защита SSH-сервера и блокировка паролей
Чтобы исключить риск взлома сервера методом автоматического перебора паролей (brute-force атаки), необходимо полностью отключить парольную аутентификацию и прямой доступ для root.
3.1 Конфигурация основного демона SSH (sshd_config)
Откройте главный конфигурационный файл SSH:
sudo nano /etc/ssh/sshd_config
Найдите и измените следующие директивы (уберите символ # в начале строки, если он присутствует):
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
- PermitRootLogin no — блокирует авторизацию под суперпользователем.
- PasswordAuthentication no — отключает вход по обычным паролям.
- KbdInteractiveAuthentication no — запрещает интерактивный ввод.
Сохраните изменения в nano: Ctrl + O -> Enter -> Ctrl + X.
3.2 Отключение переопределений Cloud-Init (Особенность Contabo)
В современных дистрибутивах Ubuntu параметры безопасности могут переопределяться облачным инициализатором cloud-init. Обязательно проверьте файл:
sudo nano /etc/ssh/sshd_config.d/50-cloud-init.conf
Если параметр PasswordAuthentication установлен в yes, измените его:
PasswordAuthentication no
3.3 Применение настроек SSH
Перезапустите демон SSH, чтобы новые правила вступили в силу:
sudo systemctl restart sshd
Проверка: Не закрывая текущую консоль, откройте новое окно терминала и попытайтесь подключиться к серверу, указав путь к вашему приватному ключу:
ssh -i "C:\Путь\к\приватному_ключу" <имя_пользователя>@<IP_адрес_сервера>
Попытка войти без правильного SSH-ключа мгновенно вернет ошибку Permission denied (publickey).
Часть 4. Базовая настройка безопасности сервера (UFW и Swap)
4.1 Настройка сетевого экрана UFW (Uncomplicated Firewall)
Оставьте открытыми только те порты, которые необходимы для работы веб-сервера и SSH:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 81/tcp
sudo ufw enable
4.2 Защита от спам-ботов с помощью Fail2ban
Установите утилиту автоматической блокировки подозрительной активности:
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
4.3 Установка часового пояса
Для корректной синхронизации системных логов переведите время сервера на UTC:
sudo timedatectl set-timezone UTC
4.4 Выделение виртуальной памяти (Swap-файл 2GB)
Создание файла подкачки предотвратит падение приложений при пиковых нагрузках (Out of Memory):
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Часть 5. Развертывание Docker и Nginx Proxy Manager
Docker позволяет контейнеризировать и полностью изолировать веб-проекты (сайты, БД). Маршрутизацию трафика обеспечит Reverse Proxy (Обратный прокси).
5.1 Установка Docker на Ubuntu 24.04
sudo apt update
sudo apt install docker.io docker-compose -y
sudo systemctl enable docker
sudo systemctl start docker
sudo usermod -aG docker $USER
(Перезайдите в SSH-сессию, чтобы применение прав группы Docker вступило в силу).
5.2 Создание виртуальной сети Docker
Создайте внутреннюю bridge-сеть для общения контейнеров без вывода портов наружу:
docker network create proxy-network
5.3 Установка Nginx Proxy Manager (NPM)
NPM — это веб-интерфейс для маршрутизации трафика и работы с Let’s Encrypt.
mkdir -p ~/docker/npm
cd ~/docker/npm
nano compose.yaml
Вставьте манифест Docker Compose:
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
- proxy-network
networks:
proxy-network:
external: true
Запустите контейнер:
docker-compose up -d
Веб-интерфейс доступен по адресу: http://<IP_адрес_сервера>:81. (Логин по умолчанию: admin@example.com, Пароль: changeme).
Часть 6. Развертывание проектов в Docker (на примере WordPress)
6.1 Настройка DNS-записей в Cloudflare
- В панели управления DNS Cloudflare создайте
A-запись (Name =@, IPv4 = IP_вашего_сервера). - Создайте
CNAME-запись дляwww(Target = ваш_домен). - Важно: Временно отключите проксирование (серое облако
DNS Only) для успешной генерации SSL-сертификата Let’s Encrypt.
6.2 Создание Docker Compose файла для WordPress и MariaDB
Контейнеры проекта должны подключаться к общей сети proxy-network.
mkdir -p ~/docker/my_project
cd ~/docker/my_project
nano compose.yaml
Обратите внимание: знак $ в паролях обязательно экранируется двойным символом $$!
services:
db:
image: mariadb:10.11
container_name: wp_db_project
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: MySecurePassword$$WithDollar
MYSQL_DATABASE: wp_database
MYSQL_USER: wp_db_user
MYSQL_PASSWORD: MySecurePassword$$WithDollar
volumes:
- ./db_data:/var/lib/mysql
networks:
- proxy-network
wordpress:
image: wordpress:latest
container_name: wp_app_project
restart: unless-stopped
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wp_db_user
WORDPRESS_DB_PASSWORD: MySecurePassword$$WithDollar
WORDPRESS_DB_NAME: wp_database
volumes:
- ./wp_data:/var/www/html
networks:
- proxy-network
networks:
proxy-network:
external: true
Запуск проекта:
docker-compose up -d
6.3 Маршрутизация трафика и выпуск SSL-сертификата
- В Nginx Proxy Manager перейдите в Hosts -> Proxy Hosts -> Add Proxy Host.
- Details: Укажите ваш домен, имя контейнера (в примере
wp_app_project) и порт80. Включите Cache Assets и Block Common Exploits. - SSL: Выберите Request a new SSL Certificate, активируйте Force SSL и согласитесь с правилами Let’s Encrypt.
- Нажмите Save.
После выпуска сертификата вернитесь в Cloudflare и активируйте проксирование (оранжевое облако). Режим шифрования в Cloudflare (SSL/TLS -> Overview) должен быть установлен на Full (strict).
Часть 7. Как исправить ошибку Permission Denied в Docker и SFTP
Проблема: При загрузке файлов в папки Docker (volumes) через SFTP (FileZilla) возникает ошибка Permission denied. Если передать права вашему пользователю Linux, доступ к файлам теряет само приложение (например, WordPress не может обновлять плагины).
Причина: Конфликт UID. Веб-сервер внутри контейнера работает под системным пользователем www-data (UID 33), а вы подключаетесь по SFTP под созданным пользователем.
Решение (Синхронизация прав chown/chmod)
Чтобы обе стороны имели полный доступ к файлам (чтение и запись), выполните в терминале SSH:
# 1. Перейдите в директорию с проброшенными файлами проекта (volumes)
cd ~/docker/my_project/wp_data/
# 2. Назначьте веб-сервер (33) владельцем, а вашего SFTP-пользователя - владельцем группы
sudo chown -R 33:<имя_пользователя> .
# 3. Дайте права (чтение, запись, выполнение) владельцу и группе на директории
sudo find . -type d -exec chmod 775 {} \;
# 4. Дайте права на чтение и запись владельцу и группе на все файлы
sudo find . -type f -exec chmod 664 {} \;
Теперь вы можете редактировать файлы через FileZilla, а WordPress сохраняет свои системные права на управление медиа и плагинами.
Привет! Это комментарий.
Чтобы начать модерировать, редактировать и удалять комментарии, перейдите на экран «Комментарии» в консоли.
Аватары авторов комментариев загружаются с сервиса Gravatar.