ByteGuide
← Все статьи🇷🇺 Русский

Подготовка сервера к продакшну: Полный чеклист

Пошаговое руководство по настройке Ubuntu сервера для production-окружения. От базовой безопасности до мониторинга.

serverproductionubuntusecurity
⏱️ 6 мин. чтения

Подготовка сервера к продакшну: Полный чеклист

⚠️ Для кого эта статья

Эта статья основана на реальном опыте разворачивания fullstack приложения (NestJS + React) на VPS. Если вы впервые настраиваете production сервер — вы в правильном месте.

🎯 Что мы будем делать

Представьте: вы арендовали VPS, получили доступ по SSH. И что дальше? Просто залить код и запустить Docker? Нет!

Production-сервер — это не просто машина с вашим приложением. Это целая экосистема из безопасности, мониторинга, резервных копий и оптимизации.

📋 Что будет настроено

  • ✅ Firewall (UFW) с правильными правилами
  • ✅ SSH с отключенным root-доступом
  • ✅ Nginx как reverse proxy + SSL
  • ✅ Docker + Docker Compose
  • ✅ Автоматическое обновление сертификатов
  • ✅ Базовый мониторинг и логирование
  • ✅ Резервное копирование БД

🖥️ Требования к серверу

Минимальные характеристики

Параметр Значение
OS Ubuntu 22.04 LTS (рекомендуется)
RAM ≥ 4GB (для NestJS + React + PostgreSQL + Redis)
CPU ≥ 2 cores
Disk ≥ 50GB SSD
Network Static IP address

🚀 Шаг 1: Первый вход и обновление системы

Подключаемся к серверу и сразу обновляем пакеты:

# Подключение к серверу
ssh root@YOUR_SERVER_IP

# Обновление системы
apt update && apt upgrade -y

# Установка базовых утилит
apt install -y curl wget git vim htop ufw

💡 Почему именно Ubuntu 22.04 LTS?

LTS (Long Term Support) — это 5 лет поддержки и обновлений безопасности. Большинство туториалов и инструкций написаны для Ubuntu. Стабильность + огромное комьюнити = меньше головной боли.

🔥 Шаг 2: Настройка Firewall (UFW)

Самое важное правило: настраивать firewall НУЖНО до того, как вы его включите. Иначе рискуете заблокировать себе доступ.

# 1. Проверить статус (должен быть inactive)
sudo ufw status

# 2. Установить политику по умолчанию
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 3. ВАЖНО! Разрешить SSH ПЕРЕД включением firewall
sudo ufw allow 22/tcp comment 'SSH'

# 4. Разрешить HTTP и HTTPS
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

# 5. Проверить правила перед активацией
sudo ufw show added

# 6. Включить firewall (подтвердить "y")
sudo ufw enable

# 7. Проверить что все применилось
sudo ufw status numbered

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

  • НЕ закрывайте текущую SSH сессию пока не убедитесь, что новая подключается
  • НЕ открывайте порты БД (PostgreSQL 5432, Redis 6379) для внешнего доступа
  • НЕ открывайте порт pgAdmin (8082) — используйте SSH туннель

🔐 Шаг 3: Безопасный доступ по SSH

Создание нового пользователя

Работать от root — плохая практика. Создаем отдельного пользователя:

# Создать пользователя (замените username на своё имя)
adduser username

# Добавить в группу sudo  
usermod -aG sudo username

# Проверить что пользователь создан
id username

Настройка SSH ключей

SSH ключи безопаснее паролей. Если у вас уже есть ключ на локальной машине:

# На вашем ЛОКАЛЬНОМ компьютере:
ssh-copy-id username@YOUR_SERVER_IP

# Или вручную:
cat ~/.ssh/id_rsa.pub | ssh username@YOUR_SERVER_IP "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Отключение root-доступа

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

# Редактировать конфиг SSH
sudo vim /etc/ssh/sshd_config

# Найти и изменить:
PermitRootLogin no
PasswordAuthentication no

# Перезапустить SSH (но не закрывайте сессию!)
sudo systemctl restart sshd

# В другом терминале проверить что новый пользователь подключается
ssh username@YOUR_SERVER_IP

🐳 Шаг 4: Установка Docker

# Удалить старые версии
sudo apt remove docker docker-engine docker.io containerd runc

# Установить зависимости
sudo apt install -y ca-certificates curl gnupg lsb-release

# Добавить GPG ключ Docker
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Добавить репозиторий Docker
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Установить Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Добавить пользователя в группу docker (чтобы не писать sudo)
sudo usermod -aG docker $USER

# Перелогиниться или применить группу
newgrp docker

# Проверить установку
docker --version
docker compose version

🌐 Шаг 5: Установка и настройка Nginx

# Установка Nginx
sudo apt install -y nginx

# Проверить статус
sudo systemctl status nginx

# Создать директории для конфигов
sudo mkdir -p /etc/nginx/sites-available
sudo mkdir -p /etc/nginx/sites-enabled
sudo mkdir -p /etc/nginx/conf.d

# Проверить конфигурацию
sudo nginx -t

# Перезапустить
sudo systemctl restart nginx

Подробную настройку Nginx с примерами конфигов для frontend и backend мы разберём в отдельной статье.

🔒 Шаг 6: SSL сертификаты с Let's Encrypt

# Установка Certbot
sudo apt install -y certbot python3-certbot-nginx

# Получить сертификат для домена (замените на свой)
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

# Проверить автообновление
sudo systemctl status certbot.timer

# Тест обновления (dry run)
sudo certbot renew --dry-run

💡 Настройка DNS

Перед получением SSL сертификата убедитесь, что DNS записи уже настроены и домен указывает на ваш сервер. Let's Encrypt проверяет это при выдаче сертификата.

📊 Шаг 7: Мониторинг и логирование

Базовый мониторинг с htop

# Установка (если не установлено)
sudo apt install -y htop

# Запуск
htop

Просмотр логов

# Логи Nginx
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log

# Логи Docker контейнеров
docker logs -f container_name

# Системные логи
sudo journalctl -u nginx -f
sudo journalctl -u docker -f

💾 Шаг 8: Резервное копирование

Автоматический бэкап PostgreSQL

# Создать скрипт бэкапа
sudo vim /usr/local/bin/backup-db.sh

Содержимое скрипта:

#!/bin/bash
BACKUP_DIR="/backups/postgres"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR

docker exec postgres pg_dump -U your_user your_db | gzip > $BACKUP_DIR/backup_$DATE.sql.gz

# Удалить бэкапы старше 7 дней
find $BACKUP_DIR -name "backup_*.sql.gz" -mtime +7 -delete

Активация:

# Сделать исполняемым
sudo chmod +x /usr/local/bin/backup-db.sh

# Добавить в cron (каждый день в 3:00)
sudo crontab -e
# Добавить строку:
# 0 3 * * * /usr/local/bin/backup-db.sh

🔍 Проверка готовности

✅ Чеклист проверки

  • UFW включен и настроен
  • SSH работает только через ключи
  • Root доступ отключен
  • Docker установлен и работает
  • Nginx установлен
  • SSL сертификаты получены
  • Автообновление сертификатов настроено
  • Резервное копирование БД настроено
  • Логи доступны и пишутся

🎯 Что дальше?

Базовая настройка завершена! Но это только начало. В следующих статьях мы разберём:

  • Настройка Nginx для production — конфигурация Nginx с примерами для frontend, backend и WebSocket
  • Безопасность production сервера — Rate limiting, security headers, защита от DDoS и другие best practices

📚 Полезные ресурсы


📝 Обновлено: 25 ноября 2025
💬 Если нашли ошибку или есть вопросы — пишите в комментариях