Вы только что получили доступ к своему первому VPS на Ubuntu 24.04 — и теперь смотрите на чёрный экран терминала с чувством, будто открыли дверь в космический корабль. Не волнуйтесь! В этой статье мы разберём, как превратить голый Ubuntu-сервер в готовую площадку для запуска Docker-контейнеров с Ruby on Rails и PostgreSQL.
🚀 Шаг 1: Первые команды после входа
Подключитесь к серверу через SSH:
ssh root@ваш_ip
Что сразу сделать:
- Обновить пакеты (чтобы избежать “у меня на локале работало!”):
apt update && apt upgrade -y - Создать пользователя (работать от root — как резать хлеб бензопилой):
adduser deploy usermod -aG sudo deploy # Даём права sudo
🐳 Шаг 2: Установка Docker и Docker Compose
Для Ubuntu 24.04:
# Устанавливаем Docker
apt install -y docker.io
# Добавляем пользователя в группу docker
usermod -aG docker deploy
# Устанавливаем Docker Compose
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
Проверяем:
docker --version
docker-compose --version
🛠️ Шаг 3: Лайт-Оптимизация для Docker
- Лимиты для контейнеров (чтобы один контейнер не сожрал все ресурсы):
nano /etc/docker/daemon.jsonДобавляем:
{ "default-ulimits": { "nofile": { "Name": "nofile", "Hard": 65536, "Soft": 65536 } }, "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }
🧠 Что здесь происходит:
-
nofile— ограничение на число открытых файлов (65536). 🔒 Предотвращает утечку дескрипторов, ошибкиEMFILE, обвалы из-за переполнения сокетов или логов. -
log-driver: json-file— стандартный драйвер логов Docker. -
max-size: 10m— каждый log-файл максимум 10 мегабайт. -
max-file: 3— хранятся 3 файла: активный + 2 старых.
🧯 Зачем:
Ограничивает рост логов, чтобы контейнер не забил весь диск /var/lib/docker/containers/…/container.log.
📌 После изменения файла перезапускаем:
systemctl restart docker
🌐 Опционально: NGINX как точка входа + HTTPS
Если для вашего приложения требуется интерфейс HTTP/HTTPS
Устанавливаем:
apt install nginx -y
Базовый конфиг (внутренний 3000 HTTP порт вашего приложения):
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Активируем:
ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
🔐 Let’s Encrypt + Certbot (HTTPS за 1 минуту)
apt install certbot python3-certbot-nginx -y
certbot --nginx -d example.com
🔁 Автоматическое обновление сертификатов уже настроено cron-ом!
🔐 Бонус: Усиление безопасности сервера
⚠️ Если не понимаете что дальше и это ваш первый сервер, то лучше не делайте
🚪 Защита SSH: новый порт и ключи вместо пароля
- Измените порт SSH (например, на 2222) и отключите вход по паролю:
nano /etc/ssh/sshd_config
Замените:
Port 2222
PasswordAuthentication no
PermitRootLogin no
-
Добавьте публичный ключ в
~/.ssh/authorized_keys. -
Перезапустите SSH:
systemctl restart sshd
💡 Не закрывайте текущую сессию — сначала убедитесь, что новый порт работает!
🔥 Базовая защита через UFW (фаервол)
ufw allow 2222/tcp # SSH (новый порт)
ufw allow 80,443/tcp # HTTP/HTTPS
ufw enable # Включаем фаервол
ufw status verbose # Проверка
❗ Совет: открой только нужные порты. Нельзя попасть на сервер = нельзя его спасти.
🛡️ Fail2Ban — баним брутфорсеров
apt install fail2ban -y
systemctl enable fail2ban --now
Это добавит автоматический бан IP-адресов при подозрительной активности.
💡 Антипаттерны новичков
- Работа от root
Проблема: Одна ошибка — и сервер превращается в “кирпич”.
Решение: Всегда используйте отдельного пользователя с sudo. - Docker без лимитов
Проблема: Контейнер с утечкой памяти парализует сервер.
Решение:--memory=512mвdocker run.
🎯 Вывод
- Docker с базовой защитой и лог-лимитами
- Защищённый SSH и брандмауэр
- NGINX как точка входа с HTTPS
- Опции для fail2ban