Подготовка сервера к продакшну: Полный чеклист
Пошаговое руководство по настройке Ubuntu сервера для production-окружения. От базовой безопасности до мониторинга.
Подготовка сервера к продакшну: Полный чеклист
⚠️ Для кого эта статья
Эта статья основана на реальном опыте разворачивания 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
📚 Полезные ресурсы
- DigitalOcean: Initial Server Setup
- Docker: Install on Ubuntu
- Certbot: Installation Guide
- Nginx Documentation
📝 Обновлено: 25 ноября 2025
💬 Если нашли ошибку или есть вопросы — пишите в комментариях