<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>CI/CD и релиз-инжиниринг on DevOps-инженер &amp; CloudAdmin</title><link>https://ru-admin.github.io/ru/posts/cicd/</link><description>Recent content in CI/CD и релиз-инжиниринг on DevOps-инженер &amp; CloudAdmin</description><generator>Hugo -- gohugo.io</generator><language>ru-RU</language><atom:link href="https://ru-admin.github.io/ru/posts/cicd/index.xml" rel="self" type="application/rss+xml"/><item><title>CI/CD и инфраструктура для Dating-сервиса</title><link>https://ru-admin.github.io/ru/posts/cicd/ci-cd-dating/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ru-admin.github.io/ru/posts/cicd/ci-cd-dating/</guid><description>&lt;h2 id="инфраструктура-и-cicd-для-продакшен-запуска-dating-сервиса"&gt;Инфраструктура и CI/CD для продакшен запуска Dating-сервиса&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="клиент"&gt;Клиент&lt;/h4&gt;
&lt;p&gt;Dating-сервис Puzzle Master&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="задача"&gt;Задача&lt;/h4&gt;
&lt;p&gt;Стартап разработал бэкенд на Nest.js + фронтенд на Angular и был готов к запуску, но не имел никакой инфраструктуры: деплой был ручным, не было CI/CD, мониторинга, бэкапов и разделения dev/prod окружений. Требовалось выстроить полный DevOps-стек с нуля под продакшен.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="решение"&gt;Решение&lt;/h4&gt;
&lt;h6 id="1-контейнеризация-приложения"&gt;1. Контейнеризация приложения&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Multi-stage Dockerfile для backend (Nest.js + Prisma, non-root пользователь)&lt;/li&gt;
&lt;li&gt;Multi-stage Dockerfile для frontend (Angular 12, legacy OpenSSL, Nginx для статики)&lt;/li&gt;
&lt;li&gt;Docker Compose с полным стеком: PostgreSQL 15, Redis 7, imgproxy, Nginx&lt;/li&gt;
&lt;li&gt;Healthchecks и &lt;code&gt;depends_on&lt;/code&gt; для правильного порядка запуска&lt;/li&gt;
&lt;li&gt;Раздельные окружения dev и prod в &lt;code&gt;/opt/dev&lt;/code&gt; и &lt;code&gt;/opt/prod&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="2-gitlab-cicd"&gt;2. GitLab CI/CD&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Миграция репозиториев с Bitbucket на GitLab&lt;/li&gt;
&lt;li&gt;Пайплайны для backend и frontend: build → push → deploy&lt;/li&gt;
&lt;li&gt;GitLab Container Registry для хранения Docker образов&lt;/li&gt;
&lt;li&gt;Автоматический деплой в dev, ручной trigger для prod&lt;/li&gt;
&lt;li&gt;SSH деплой на VPS через &lt;code&gt;SSH_PRIVATE_KEY&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="3-nginx-reverse-proxy"&gt;3. Nginx Reverse Proxy&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Универсальный конфиг через &lt;code&gt;envsubst&lt;/code&gt; для dev/prod&lt;/li&gt;
&lt;li&gt;SSL/TLS (TLSv1.2, TLSv1.3) с сертификатами Cloudflare&lt;/li&gt;
&lt;li&gt;Проксирование &lt;code&gt;/api/*&lt;/code&gt; → backend:4000, &lt;code&gt;/*&lt;/code&gt; → frontend:80&lt;/li&gt;
&lt;li&gt;Редирект www → основной домен (301)&lt;/li&gt;
&lt;li&gt;Отдельный стек imgproxy с SSL терминацией&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="4-безопасность-ansible"&gt;4. Безопасность (Ansible)&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Настройка сервера через Ansible: SSH только по ключам, отключён root&lt;/li&gt;
&lt;li&gt;UFW Firewall: открыты только порты 80, 443, кастомный SSH&lt;/li&gt;
&lt;li&gt;Доступ к БД только через SSH Tunnel (Beekeeper Studio)&lt;/li&gt;
&lt;li&gt;Секреты в переменных GitLab CI/CD&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="5-мониторинг"&gt;5. Мониторинг&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Prometheus + Grafana с автоматическим провижинингом дашбордов&lt;/li&gt;
&lt;li&gt;Exporters: Node, cAdvisor, Postgres, Redis, Nginx, Blackbox&lt;/li&gt;
&lt;li&gt;5 Grafana дашбордов: сервер, Docker контейнеры, PostgreSQL, Redis, Nginx&lt;/li&gt;
&lt;li&gt;Alertmanager с интеграцией в Telegram, алерты на CPU/RAM/Disk/API/SSL&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="6-бэкапы-бд"&gt;6. Бэкапы БД&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Автоматический &lt;code&gt;pg_dump&lt;/code&gt; каждый час&lt;/li&gt;
&lt;li&gt;Сжатие gzip и загрузка в Cloudflare R2 (S3-compatible)&lt;/li&gt;
&lt;li&gt;Prometheus метрики бэкапов: успех, размер, timestamp&lt;/li&gt;
&lt;li&gt;Алерты: &lt;code&gt;DatabaseBackupMissing&lt;/code&gt;, &lt;code&gt;DatabaseBackupFailed&lt;/code&gt;, DatabaseBackupSize`Anomaly&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="технологии"&gt;Технологии&lt;/h4&gt;
&lt;div class="row"&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ru-admin.github.io/icons/gitlab-original.svg" alt="GitLab"&gt;&lt;div&gt;GitLab CI&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ru-admin.github.io/icons/docker-original.svg" alt="Docker"&gt;&lt;div&gt;Docker&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ru-admin.github.io/icons/ansible-original.svg" alt="Ansible"&gt;&lt;div&gt;Ansible&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ru-admin.github.io/icons/prometheus-original.svg" alt="Prometheus"&gt;&lt;div&gt;Prometheus&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ru-admin.github.io/icons/nginx.svg" alt="Nginx"&gt;&lt;div&gt;Nginx&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ru-admin.github.io/icons/postgresql.svg" alt="PostgreSQL"&gt;&lt;div&gt;PostgreSQL&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h4 id="результаты"&gt;Результаты&lt;/h4&gt;
&lt;p&gt;✅ &lt;strong&gt;Деплой:&lt;/strong&gt; git push в main → автоматическая сборка и деплой на сервер&lt;br&gt;
✅ &lt;strong&gt;Окружения:&lt;/strong&gt; полное разделение dev и prod на одном VPS&lt;br&gt;
✅ &lt;strong&gt;Мониторинг:&lt;/strong&gt; 5 дашбордов, алерты в Telegram по 6 категориям&lt;br&gt;
✅ &lt;strong&gt;Бэкапы:&lt;/strong&gt; автоматический &lt;code&gt;pg_dump&lt;/code&gt; каждый час в Cloudflare R2&lt;br&gt;
✅ &lt;strong&gt;Безопасность:&lt;/strong&gt; UFW, SSH по ключам, БД закрыта извне&lt;br&gt;
✅ &lt;strong&gt;Масштабируемость:&lt;/strong&gt; архитектура готова к выносу БД на отдельный сервер&lt;/p&gt;</description></item><item><title>CI/CD с GitLab + Kubernetes: деплой за 10 минут</title><link>https://ru-admin.github.io/ru/posts/cicd/ci-cd-gitlab/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ru-admin.github.io/ru/posts/cicd/ci-cd-gitlab/</guid><description>&lt;h2 id="автоматизация-cicd-от-2-часов-до-10-минут-деплоя"&gt;Автоматизация CI/CD: от 2 часов до 10 минут деплоя&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="клиент"&gt;Клиент&lt;/h4&gt;
&lt;p&gt;Стартап в сфере e-commerce, команда разработки 5 человек&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="задача"&gt;Задача&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Ручной деплой занимал 2 часа&lt;/li&gt;
&lt;li&gt;Частые ошибки при развертывании&lt;/li&gt;
&lt;li&gt;Невозможность быстро откатить изменения&lt;/li&gt;
&lt;li&gt;Требовалось: автоматизация CI/CD, GitOps, быстрый откат&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="решение"&gt;Решение&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Self-hosted GitLab&lt;/li&gt;
&lt;li&gt;GitLab CI пайплайн (Build → Test → Deploy)&lt;/li&gt;
&lt;li&gt;Managed Kubernetes в Yandex Cloud&lt;/li&gt;
&lt;li&gt;Flux CD для GitOps&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h4 id="технологии"&gt;Технологии&lt;/h4&gt;
&lt;div class="row"&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ru-admin.github.io/icons/gitlab-original.svg" alt="GitLab"&gt;&lt;div&gt;GitLab&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ru-admin.github.io/icons/docker-original.svg" alt="Docker"&gt;&lt;div&gt;Docker&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ru-admin.github.io/icons/kubernetes-plain.svg" alt="Kubernetes"&gt;&lt;div&gt;Kubernetes&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ru-admin.github.io/icons/helm-original.svg" alt="Helm"&gt;&lt;div&gt;Helm&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ru-admin.github.io/icons/flux-cd.svg" alt="Flux CD"&gt;&lt;div&gt;Flux CD&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h4 id="результаты"&gt;Результаты&lt;/h4&gt;
&lt;p&gt;✅ &lt;strong&gt;Время деплоя:&lt;/strong&gt; с 2 часов до 10 минут (12x)&lt;br&gt;
✅ &lt;strong&gt;Ошибки:&lt;/strong&gt; −90%&lt;br&gt;
✅ &lt;strong&gt;Частота деплоя:&lt;/strong&gt; с 1/неделя до 10+/день&lt;br&gt;
✅ &lt;strong&gt;Время отката:&lt;/strong&gt; с 1 часа до 2 минут&lt;/p&gt;</description></item></channel></rss>