Hero Image
CI/CD и инфраструктура для Dating-сервиса

Инфраструктура и CI/CD для продакшен запуска Dating-сервиса Клиент Dating-сервис Puzzle Master Задача Стартап разработал бэкенд на Nest.js + фронтенд на Angular и был готов к запуску, но не имел никакой инфраструктуры: деплой был ручным, не было CI/CD, мониторинга, бэкапов и разделения dev/prod окружений. Требовалось выстроить полный DevOps-стек с нуля под продакшен. Решение 1. Контейнеризация приложения Multi-stage Dockerfile для backend (Nest.js + Prisma, non-root пользователь) Multi-stage Dockerfile для frontend (Angular 12, legacy OpenSSL, Nginx для статики) Docker Compose с полным стеком: PostgreSQL 15, Redis 7, imgproxy, Nginx Healthchecks и depends_on для правильного порядка запуска Раздельные окружения dev и prod в /opt/dev и /opt/prod 2. GitLab CI/CD Миграция репозиториев с Bitbucket на GitLab Пайплайны для backend и frontend: build → push → deploy GitLab Container Registry для хранения Docker образов Автоматический деплой в dev, ручной trigger для prod SSH деплой на VPS через SSH_PRIVATE_KEY 3. Nginx Reverse Proxy Универсальный конфиг через envsubst для dev/prod SSL/TLS (TLSv1.2, TLSv1.3) с сертификатами Cloudflare Проксирование /api/* → backend:4000, /* → frontend:80 Редирект www → основной домен (301) Отдельный стек imgproxy с SSL терминацией 4. Безопасность (Ansible) Настройка сервера через Ansible: SSH только по ключам, отключён root UFW Firewall: открыты только порты 80, 443, кастомный SSH Доступ к БД только через SSH Tunnel (Beekeeper Studio) Секреты в переменных GitLab CI/CD 5. Мониторинг Prometheus + Grafana с автоматическим провижинингом дашбордов Exporters: Node, cAdvisor, Postgres, Redis, Nginx, Blackbox 5 Grafana дашбордов: сервер, Docker контейнеры, PostgreSQL, Redis, Nginx Alertmanager с интеграцией в Telegram, алерты на CPU/RAM/Disk/API/SSL 6. Бэкапы БД Автоматический pg_dump каждый час Сжатие gzip и загрузка в Cloudflare R2 (S3-compatible) Prometheus метрики бэкапов: успех, размер, timestamp Алерты: DatabaseBackupMissing, DatabaseBackupFailed, DatabaseBackupSize`Anomaly Технологии GitLab CI Docker Ansible Prometheus Nginx PostgreSQL Результаты ✅ Деплой: git push в main → автоматическая сборка и деплой на сервер ✅ Окружения: полное разделение dev и prod на одном VPS ✅ Мониторинг: 5 дашбордов, алерты в Telegram по 6 категориям ✅ Бэкапы: автоматический pg_dump каждый час в Cloudflare R2 ✅ Безопасность: UFW, SSH по ключам, БД закрыта извне ✅ Масштабируемость: архитектура готова к выносу БД на отдельный сервер

Hero Image
CI/CD и инфраструктура для веб-приложения

Инфраструктура и CI/CD для сайта компании Клиент Компания-производитель фирменных исследовательских продуктов, которой требовался сайт для публикации каталога продукции Задача Разработчики написали код обычного веб-приложения (backend NestJS + frontend Next.js), но инфраструктура полностью отсутствовала: деплой выполнялся вручную, не было CI/CD, настроенного сервера, мониторинга, бэкапов и разделения тестового и боевого окружений. Требовалось выстроить полный DevOps-стек с нуля: GitLab CI/CD, собственный сервер, два изолированных контура, HTTPS, мониторинг, оповещения и автоматические бэкапы. Решение 1. Подготовка сервера и безопасность VPS на Ubuntu 24.04: 4 vCPU, 6 ГБ RAM, 120 ГБ диск SSH только по ключам, отключён root, выделенный деплой-пользователь (sudo + docker) UFW Firewall: открыты только порты 80, 443, 22 и SFTP (2222/2223) Автоматические обновления безопасности (unattended-upgrades) 2. GitLab CI/CD Self-hosted GitLab с групповым Container Registry Пайплайны для backend и frontend: build → push → deploy Привязка веток: test → образ :test → контур test; master → образ :latest → контур prod; теги v* → релизные сборки; dev → только сборка SSH-деплой на сервер через SSH_PRIVATE_KEY, секреты в Protected CI-переменных Инфраструктурный репозиторий server-devops с джобой deploy-all: жёсткий сброс к origin + docker compose up -d --pull always 3. Docker Compose и контуры Три compose-файла: app/ (test), app-prod/ (prod), monitoring/ на общей Docker-сети Сервисы каждого контура: backend NestJS, frontend Next.js, PostgreSQL 16, pgAdmin, SFTP Политика рестарта on-failure:10 для всех контейнеров приложений Все конфиги, дашборды и правила — в git, применяются пайплайном 4. Reverse Proxy и HTTPS Единый reverse proxy nginx-proxy + acme-companion на портах 80/443 Автоматические сертификаты Let’s Encrypt с автопродлением Все точки входа только по HTTPS: основной сайт, тестовый контур, панель управления БД, мониторинг 5. Мониторинг и алерты Prometheus + Grafana с автоматическим провижинингом дашбордов из git (4 дашборда: cAdvisor, Node Exporter, Logs/App, PostgreSQL) Exporters: node, cAdvisor, postgres, nginx (stub_status + access-лог: RPS, 4xx/5xx, время ответа/апстримов), HTTP-пробы blackbox для frontend/backend Alertmanager с интеграцией в Telegram — один бот, отдельные чаты на каждый контур (test / prod) Правила алертов: падение сервисов, высокая нагрузка CPU/RAM/диск (>80%), циклы рестартов, ошибки 5xx backend 6. Логирование и бэкапы Loki + Promtail: логи всех контейнеров собираются и доступны в Grafana (Logs Drilldown) Автоматический скрипт бэкапа: pg_dump БД prod + tar-стрим тома загрузок prod в единый архив Ротация 30 дней, ежедневный cron в 03:00, процедура восстановления проверена и задокументирована Технологии GitLab CI Docker Prometheus Grafana Nginx PostgreSQL Результаты ✅ Деплой: merge в master → автоматическая сборка, публикация и деплой на сервер ✅ Окружения: полное разделение test и prod на одном VPS через общую Docker-сеть ✅ HTTPS: все сервисы только по HTTPS с автоматическими сертификатами Let’s Encrypt ✅ Мониторинг: 4 дашборда, пробы доступности, алерты в Telegram (отдельные чаты на контур) ✅ Бэкапы: ежедневный бэкап БД prod + тома загрузок, ротация 30 дней, восстановление проверено ✅ Безопасность: SSH по ключам, отключён root, UFW, секреты в Protected CI-переменных

Hero Image
Интернет-радио на AzuraCast

Восстановление и развёртывание интернет-радио с нуля Клиент Сообщество авторских исполнителей с мобильным приложением и аудиторией в несколько десятков ежедневных слушателей Задача После потери арендованного VPS (вместе с действующей конфигурацией, сайтом и историей вещания) потребовалось полностью восстановить вещание двух интернет-радиостанций. На входе — только набор mp3-файлов. Требовалось развернуть новый сервер, настроить платформу автоматизированного вещания, воссоздать сайт-визитку с встроенным плеером и обеспечить стабильную работу 24/7. Решение 1. Инфраструктура и контрольная панель Аренда нового VPS и установка Hestia Control Panel как базового слоя управления сервером Hestia обеспечивала: базовую защиту (fail2ban, firewall), автоматическое получение и обновление Let’s Encrypt сертификатов, управление доменами и резервное копирование веб-сайта Создан отдельный домен в Hestia для AzuraCast — для получения SSL-сертификата; домен настроен как reverse proxy на порт AzuraCast Nginx в составе Hestia выступал фронтенд-прокси: терминировал TLS и передавал трафик во внутренний сервис 2. AzuraCast — платформа вещания Установка AzuraCast (self-hosted, Docker-вариант) с нуля на подготовленный сервер Развёрнуты две независимые радиостанции в рамках одной инсталляции: Станция 1 — медитативная и этническая музыка, длинные композиции (в том числе треки продолжительностью до 30 минут) Станция 2 — авторская музыка частных исполнителей сообщества Настроен стек вещания: Liquidsoap (автоматизация и ротация) + Icecast (стриминг-сервер для слушателей) Загружена и каталогизирована вся медиатека из предоставленных mp3-файлов 3. Ротация и расписание вещания Настроена умная ротация с учётом хронометража треков: длинные композиции (20–30 минут) вынесены в ночное расписание, чтобы не нарушать дневной listening experience Дневной эфир составлен из коротких и средних треков с комфортным ритмом Добавлены джинглы (отбивки) с интервалом каждые 30 минут — для создания радийного ощущения и брендинга станций Настроены плейлисты с разными режимами ротации (sequential, shuffled, scheduled) 4. Статистика и мониторинг Активирован встроенный модуль статистики AzuraCast (AzuraCast Analytics) на базе InfluxDB Сбор данных: количество слушателей в реальном времени, история подключений, geography listeners, популярные треки, пиковые нагрузки Данные позволили подтвердить аудиторию: 20–30 уникальных слушателей ежедневно, сессии по несколько часов, пик до 50 одновременных подключений 5. Форматы и потоки вещания Настроено несколько Mount Points для каждой станции с разными битрейтами: Высокое качество: MP3 320 kbps для десктопных клиентов Среднее качество: MP3 128 kbps для мобильных устройств и встроенного плеера в приложении AAC / OGG как альтернативные форматы Настроены метаданные потока: название станции, текущий трек, обложка — всё транслируется в ICY metadata 6. Сайт-визитка на Joomla На том же сервере (отдельный домен через Hestia) развёрнута Joomla CMS с двуязычной конфигурацией (ru / en) В качестве фреймворка использован Helix3 Ultimate Framework + конструктор страниц SP Page Builder — позволили собрать лендинг без написания вёрстки вручную Структура сайта: главная с описанием сообщества и радиостанций, встроенный HTML5-плеер от AzuraCast (iframe embed) для обеих станций, контактная информация Сайт доступен по прямым ссылкам и служит точкой входа для слушателей вне мобильного приложения 7. Резервное копирование Резервное копирование AzuraCast настроено по расписанию средствами встроенного скрипта: полный бэкап (конфигурация, база данных, медиатека) сохраняется локально Настроена репликация бэкапов по SSH на удалённый сервер — для защиты от потери данных при отказе основного хоста (именно такой сценарий уже случался ранее) Резервное копирование веб-сайта (Joomla) — через встроенный механизм Hestia Технологии Linux Nginx Docker Bash Joomla Let's Encrypt Результаты ✅ Восстановление: вещание возобновлено с нуля по единственным исходным данным — набору mp3-файлов ✅ Две станции: независимые эфиры с разными форматами и расписаниями ротации ✅ Аудитория: 20–30 ежедневных слушателей, сессии по несколько часов, пики до 50 одновременных подключений ✅ Надёжность: работа 24/7, многоуровневое резервное копирование (локально + remote SSH) ✅ Безопасность: SSL/TLS для всех точек входа, fail2ban, изолированные домены ✅ Сопровождение: техническая поддержка в течение ~2 лет — обновления, добавление треков, правки сайта