Серверный стек на Ubuntu: nginx, БД, Docker
Этот раздел про инфраструктуру, на которой живёт типичное веб-приложение: фронт-прокси, база данных, контейнеры, кэш. Здесь карта стека и порядок, в котором его обычно поднимают на Ubuntu Server.
Из чего собирается типовой стек
Веб-приложение на Ubuntu обычно живёт в одной из двух топологий: либо «всё на хосте» (nginx + сервис + БД на одной машине), либо «контейнеры под Compose» (nginx-прокси хоста + Compose-стек с приложением и БД). Базовый набор компонентов один:
- Фронт-прокси: nginx терминирует HTTPS, отдаёт статику, проксирует динамику.
- Приложение: бэкенд-сервис (Python/Node/Go/.NET/PHP) под systemd или в контейнере.
- База данных: PostgreSQL или MySQL — обычно отдельным контейнером или нативным сервисом.
- Кэш и очереди: Redis / RabbitMQ для тяжёлых сценариев.
Каждый компонент имеет свой раздел в гайде.
nginx как reverse proxy
nginx — стандартный фронт для любого приложения: терминирует SSL (через certbot), отдаёт статику быстро, проксирует динамические запросы на upstream. Настройка proxy_pass, заголовков, кэширования и WebSocket — в nginx reverse proxy на Ubuntu.
Docker Compose: стек одной командой
Compose описывает многосервисный стек в одном YAML и поднимает его одной командой. Подходит для приложений из 2-10 контейнеров, для типичной связки «бэкенд + БД + Redis». Установка Docker + Compose, базовый docker-compose.yml и production-практики — в Docker Compose на Ubuntu.
База данных: PostgreSQL или MySQL
Для приложения на одну машину БД ставят либо нативно (apt install postgresql), либо в Compose-контейнер с volume под /var/lib/postgresql/data. Бэкапы делаются через pg_dump/mysqldump плюс файловую копию /var/lib/... после остановки. Регулярный дамп складывается в объектное хранилище через rsync.
HTTPS и сертификаты
Любой публичный фронт-сервис должен ходить только по HTTPS. На Ubuntu это делается через certbot + Let's Encrypt с автообновлением. См. Let's Encrypt и certbot на Ubuntu.
Безопасность стека
UFW закрывает всё, кроме 80/443 и SSH. Контейнеры публикуют порты только нужные. См. UFW на Ubuntu для базовой настройки фаервола и SSH-ключи на Ubuntu для безопасного доступа.
Что запускать через systemd, что — через Compose
Простое правило: если сервис один и без зависимостей — systemd-юнит проще и легче. Если связка из 3+ компонентов с общей сетью и volumes — Compose. nginx и БД на хосте остаются под systemd, прикладные сервисы заворачиваются в Compose. Подробнее про systemd — в systemd-юнит и systemctl enable.
Частые вопросы
Compose в проде — это плохо?
Нет, если у вас одна машина и стек до 10 сервисов. Compose стабильный и production-ready. Kubernetes имеет смысл от десятков сервисов с автоскейлом, для одной VPS — оверкилл.
Где терминировать HTTPS — на nginx-хосте или в контейнере?
На nginx-хосте. Так certbot получает прямой доступ к 80 порту для ACME-challenge, и SSL-сертификаты не дублируются по контейнерам.
Какую БД ставить — PostgreSQL или MySQL?
Для нового проекта без специфических ограничений — PostgreSQL: строже к типам, мощнее JSONB, лучше планировщик. MySQL — если приложение уже завязано на него или нужен MySQL-специфичный фичи (вроде master-slave-репликации с минимальными настройками).
Запускать Docker от root опасно?
Доступ к сокету /var/run/docker.sock эквивалентен root-доступу к хосту. Не давайте его недоверенным пользователям и не пробрасывайте сокет в публичные контейнеры.
Что запомнить
- nginx — фронт-прокси по умолчанию: HTTPS, статика, proxy_pass.
- Compose — для связок 2-10 сервисов; одиночные сервисы — systemd.
- БД на хосте или в Compose, главное — внешний бэкап через pg_dump + rsync.
- HTTPS обязательно через certbot, никакой публичный 80 порт без редиректа.
- UFW закрывает всё, кроме 80/443 и SSH; контейнеры публикуют порты явно.
- Docker-сокет — это root, не давайте его никому, кому не доверяете.