Files
magistr/resume/index.html
2026-07-04 22:15:05 +03:00

425 lines
25 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Зуев Егор — Junior DevOps / Infrastructure Engineer</title>
<meta name="description"
content="Резюме Зуева Егора Алексеевича: Junior DevOps / Infrastructure Engineer. K3s, Caddy, Ansible, PostgreSQL, OpenTelemetry, SigNoz, Homelab, AI-агенты и LLM API.">
<meta name="keywords"
content="DevOps, Junior DevOps, Зуев Егор, Kubernetes, K3s, Ansible, Caddy, PostgreSQL, OpenTelemetry, SigNoz, Proxmox, Homelab, AI agents, LLM API, нейросети, ИИ агенты">
<meta property="og:title" content="Зуев Егор — Junior DevOps / Infrastructure Engineer">
<meta property="og:description"
content="Инженерное резюме: мультитенантная инфраструктура стартапа «Умное расписание», CI/CD, IaC, Observability, Homelab и практическое применение AI-агентов.">
<meta property="og:type" content="profile">
<meta property="og:url" content="https://magistr.zuev.company/resume/">
<link rel="stylesheet" href="style.css">
</head>
<body>
<nav class="topbar" aria-label="Навигация по резюме">
<a class="brand" href="#profile" aria-label="К началу резюме">
<span class="brand-mark">EZ</span>
<span>DevOps</span>
</a>
<div class="nav-links">
<a class="nav-link" href="#profile">Профиль</a>
<a class="nav-link" href="#startup">Стартап</a>
<a class="nav-link" href="#homelab">Homelab</a>
<a class="nav-link" href="#stack">Стек</a>
<a class="nav-link" href="#incidents">Инциденты</a>
<a class="nav-link" href="#education">Образование</a>
</div>
<div class="topbar-actions">
<button class="icon-button" id="btnPrint" type="button" aria-label="Сохранить в PDF">
<span>PDF</span>
</button>
<a class="primary-action" href="https://t.me/ZuevEA" target="_blank" rel="noopener noreferrer">Связаться</a>
</div>
</nav>
<main>
<section class="hero section-shell" id="profile">
<div class="hero-copy reveal">
<div class="status-row">
<span class="status-pill">Ищу предложения</span>
<span>Junior DevOps / Infrastructure Engineer</span>
<span>AI-агенты и LLM API</span>
<span>100 000 ₽ на руки</span>
</div>
<h1>Зуев Егор Алексеевич</h1>
<p class="lead">
DevOps-инженер с базой в информационной безопасности: проектирую инфраструктуру для
мультитенантных веб-сервисов, автоматизирую развертывание и делаю наблюдаемость полезной
для поиска проблем, а не просто красивой витриной метрик.
</p>
<div class="contact-grid" aria-label="Контактная информация">
<button class="contact-chip" type="button" data-copy="+7 (910) 740-05-55">
<span class="chip-label">Телефон</span>
<span>+7 (910) 740-05-55</span>
</button>
<button class="contact-chip" type="button" data-copy="ez@e-zuev.ru">
<span class="chip-label">Email</span>
<span>ez@e-zuev.ru</span>
</button>
<a class="contact-chip" href="https://t.me/ZuevEA" target="_blank" rel="noopener noreferrer">
<span class="chip-label">Telegram</span>
<span>@ZuevEA</span>
</a>
<span class="contact-chip">
<span class="chip-label">Локация</span>
<span>Курск / удаленно</span>
</span>
</div>
</div>
<aside class="architecture-board reveal" aria-label="Карта инженерного вклада">
<span class="board-kicker">Инженерный контур</span>
<h2 class="board-title">От кода до работающего сервиса</h2>
<p class="board-lead">
Закрываю практические задачи DevOps: собираю приложение в контейнеры, доставляю в Kubernetes,
изолирую данные клиентов и настраиваю наблюдаемость для быстрого разбора проблем.
</p>
<div class="delivery-lane" aria-label="Цепочка работы">
<div class="lane-step">
<span>01</span>
<strong>Сборка</strong>
<p>Docker-образы backend и frontend, приватный registry, Gitea Actions.</p>
</div>
<div class="lane-step">
<span>02</span>
<strong>Доставка</strong>
<p>K3s, Traefik, Caddy, rolling update и проверка rollout-статуса.</p>
</div>
<div class="lane-step">
<span>03</span>
<strong>Данные</strong>
<p>Отдельная PostgreSQL БД для каждого вуза, HikariCP, Flyway, backup и изоляция доступа.</p>
</div>
<div class="lane-step">
<span>04</span>
<strong>Контроль</strong>
<p>OpenTelemetry, SigNoz, tenant.id в логах и трассировках.</p>
</div>
</div>
<div class="board-proof" aria-label="Что это дает проекту">
<div>
<b>Безопаснее</b>
<span>секреты в Vault, RBAC и принцип наименьших привилегий</span>
</div>
<div>
<b>Понятнее</b>
<span>инциденты привязаны к конкретному вузу и его БД</span>
</div>
<div>
<b>Быстрее</b>
<span>новый вуз подключается без ручной сборки окружения</span>
</div>
</div>
</aside>
</section>
<section class="evidence-band">
<div class="section-shell evidence-grid">
<article class="evidence-card reveal">
<span class="eyebrow">Инфраструктура</span>
<h2>Мультитенантность без общей базы</h2>
<p>Выбран и реализован подход Database-per-Tenant: отдельная PostgreSQL БД для каждого вуза,
изоляция сетевого доступа и независимое обслуживание.</p>
</article>
<article class="evidence-card reveal">
<span class="eyebrow">Автоматизация</span>
<h2>IaC и безопасный провижининг</h2>
<p>Ansible-роли для подготовки хостов, SSH hardening, firewall, PostgreSQL, backup и мониторинга.
Секреты вынесены в Ansible Vault.</p>
</article>
<article class="evidence-card reveal">
<span class="eyebrow">Observability</span>
<h2>Трассировка с контекстом тенанта</h2>
<p>OpenTelemetry + SigNoz + MDC позволяют фильтровать логи и трейсы по `tenant.id`, чтобы быстрее
понимать, какой вуз затронут проблемой.</p>
</article>
</div>
</section>
<section class="section-shell case-section" id="startup">
<div class="section-heading reveal">
<span class="eyebrow">Проектный опыт</span>
<h2>Стартап «Умное расписание»</h2>
<p>Система управления университетским расписанием с мультитенантной архитектурой: отдельные базы
данных для вузов, Kubernetes-контур, автоматизация инфраструктуры и сквозная наблюдаемость.</p>
</div>
<div class="case-layout">
<aside class="case-summary reveal">
<div>
<span class="summary-label">Роль</span>
<strong>DevOps / Infrastructure Engineer</strong>
</div>
<div>
<span class="summary-label">Период</span>
<strong>Декабрь 2025 — настоящее время</strong>
</div>
<div>
<span class="summary-label">Контур</span>
<strong>K3s, Proxmox VE, Caddy, PostgreSQL, SigNoz</strong>
</div>
<a class="text-link" href="https://magistr.zuev.company" target="_blank"
rel="noopener noreferrer">magistr.zuev.company</a>
</aside>
<div class="work-streams">
<article class="work-card reveal">
<div class="work-card-marker">01</div>
<h3>Kubernetes и маршрутизация</h3>
<p>Развернул прикладной контур в K3s: namespace `magistr`, frontend на Apache httpd, backend
Spring Boot, Traefik Ingress и внешний Caddy как TLS-терминатор и балансировщик между
нодами.</p>
<ul>
<li>Frontend в 2 репликах для rolling update.</li>
<li>Backend с OpenTelemetry Java Agent.</li>
<li>Caddy проксирует `/*`, `/api/*` и OTLP-трафик.</li>
</ul>
</article>
<article class="work-card reveal">
<div class="work-card-marker">02</div>
<h3>Динамические тенанты</h3>
<p>Спроектировал добавление новых университетов без правки исходного кода: `tenants-config`
хранится в Kubernetes ConfigMap, backend обновляет его через Kubernetes API.</p>
<ul>
<li>`initContainer` копирует read-only ConfigMap в writable `emptyDir`.</li>
<li>RBAC ограничен операциями `get` и `patch` для конкретной ConfigMap.</li>
<li>`TenantConfigWatcher` сверяет конфигурацию каждые 30 секунд.</li>
</ul>
</article>
<article class="work-card reveal">
<div class="work-card-marker">03</div>
<h3>Отказоустойчивость старта</h3>
<p>Устранил риск каскадного падения backend при недоступности одной из БД: приложение стартует
без CrashLoopBackOff и продолжает подключаться к проблемной БД в фоне.</p>
<ul>
<li>H2 in-memory fallback, если нет настроенных тенантов.</li>
<li>`setInitializationFailTimeout(-1)` для HikariCP.</li>
<li>Явный PostgreSQL dialect для Hibernate.</li>
</ul>
</article>
<article class="work-card reveal">
<div class="work-card-marker">04</div>
<h3>Ansible и безопасность</h3>
<p>Собрал модульный плейбук для подготовки серверов БД: базовый hardening, Docker, firewall,
PostgreSQL, backup и OpenTelemetry Collector.</p>
<ul>
<li>SSH на порту 2222, отключение root/password login.</li>
<li>UFW/firewalld с доступом к PostgreSQL только с IP нод K3s.</li>
<li>Секреты PostgreSQL зашифрованы через Ansible Vault.</li>
</ul>
</article>
<article class="work-card reveal">
<div class="work-card-marker">05</div>
<h3>CI/CD и приватный registry</h3>
<p>Настроил Gitea Actions: сборка backend/frontend Docker-образов, публикация в приватный
registry и деплой через `kubectl rollout` на self-hosted runner.</p>
<ul>
<li>Docker Buildx для сборки образов.</li>
<li>Kubernetes secret `gitea-registry` для pull-доступа.</li>
<li>Отдельный LXC-контейнер под runner.</li>
</ul>
</article>
<article class="work-card reveal">
<div class="work-card-marker">06</div>
<h3>Наблюдаемость</h3>
<p>Внедрил OpenTelemetry и SigNoz с детализацией по тенантам: логи, трейсы, JVM/HTTP-метрики и
PostgreSQL-метрики с хостов БД.</p>
<ul>
<li>`tenant.id` попадает в MDC и атрибуты span.</li>
<li>SigNoz + ClickHouse вынесены в отдельный LXC-контейнер.</li>
<li>OTel Collector собирает PostgreSQL и host-метрики.</li>
</ul>
</article>
</div>
</div>
</section>
<section class="section-shell homelab-section" id="homelab">
<div class="section-heading reveal">
<span class="eyebrow">Практика вне стартапа</span>
<h2>Homelab и самостоятельная инженерная база</h2>
<p>Отдельный контур для экспериментов с Linux, виртуализацией, сетями, мониторингом и автоматизацией.
Не смешиваю его с проектным опытом, но использую как полигон для навыков.</p>
</div>
<div class="homelab-grid">
<article class="lab-card reveal">
<h3>Виртуализация и хранение</h3>
<p>Proxmox VE, LXC/KVM, Debian/Ubuntu Server, ZFS-пулы, snapshots и отдельные изолированные
окружения для сервисов.</p>
</article>
<article class="lab-card reveal">
<h3>Self-hosted разработка</h3>
<p>Gitea и Forgejo для репозиториев, webhooks, тестов CI-сценариев и безопасной отработки
automation-паттернов.</p>
</article>
<article class="lab-card reveal">
<h3>Linux и эксплуатация</h3>
<p>CachyOS/Arch на рабочей машине, systemd, journalctl, bash-скрипты, pacman, разбор проблем через
системные логи.</p>
</article>
<article class="lab-card reveal">
<h3>Мониторинг железа</h3>
<p>Prometheus, Node Exporter и Grafana для CPU, дисков, температур, сетевой активности и базовых
алертов по состоянию сервера.</p>
</article>
<article class="lab-card lab-card-ai reveal">
<h3>AI-агенты и нейросети</h3>
<p>Профессионально использую топовые нейросети, оплачиваю подписки, работаю с LLM API и настроил
Hermes Agent на личном сервере для быстрого удалённого администрирования.</p>
</article>
</div>
</section>
<section class="stack-band" id="stack">
<div class="section-shell">
<div class="section-heading reveal">
<span class="eyebrow">Стек по зонам ответственности</span>
<h2>Инструменты, которые уже применял руками</h2>
</div>
<div class="stack-matrix">
<article class="stack-column reveal">
<h3>Runtime и оркестрация</h3>
<div class="tag-list">
<span>Docker</span>
<span>Docker Compose</span>
<span>Kubernetes</span>
<span>K3s</span>
<span>Traefik</span>
<span>Caddy</span>
</div>
</article>
<article class="stack-column reveal">
<h3>IaC и доставка</h3>
<div class="tag-list">
<span>Ansible</span>
<span>Ansible Vault</span>
<span>Gitea Actions</span>
<span>Forgejo</span>
<span>Git</span>
<span>Bash</span>
</div>
</article>
<article class="stack-column reveal">
<h3>Данные и resiliency</h3>
<div class="tag-list">
<span>PostgreSQL</span>
<span>HikariCP</span>
<span>Flyway</span>
<span>H2 fallback</span>
<span>ZFS</span>
<span>Backup</span>
</div>
</article>
<article class="stack-column reveal">
<h3>Observability и безопасность</h3>
<div class="tag-list">
<span>OpenTelemetry</span>
<span>SigNoz</span>
<span>ClickHouse</span>
<span>Prometheus</span>
<span>Grafana</span>
<span>UFW/firewalld</span>
</div>
</article>
<article class="stack-column reveal">
<h3>AI и агентная автоматизация</h3>
<div class="tag-list">
<span>Hermes Agent</span>
<span>LLM API</span>
<span>AI Agents</span>
<span>ChatGPT</span>
<span>Claude</span>
<span>Prompting</span>
</div>
</article>
</div>
</div>
</section>
<section class="section-shell incidents-section" id="incidents">
<div class="section-heading reveal">
<span class="eyebrow">Runbook-мышление</span>
<h2>Как подхожу к инцидентам</h2>
<p>Короткие сценарии показывают порядок действий: сначала локализация и границы ущерба, затем
восстановление, потом предотвращение повтора.</p>
</div>
<div class="incident-layout reveal">
<div class="incident-tabs" role="tablist" aria-label="Сценарии инцидентов">
<button class="incident-tab active" type="button" data-incident="postgres">PostgreSQL CPU 100%</button>
<button class="incident-tab" type="button" data-incident="tls">TLS / Caddy 502</button>
<button class="incident-tab" type="button" data-incident="runner">Gitea Runner завис</button>
</div>
<article class="incident-panel" id="incidentPanel" aria-live="polite"></article>
</div>
</section>
<section class="section-shell education-section" id="education">
<div class="section-heading reveal">
<span class="eyebrow">Образование</span>
<h2>Информационная безопасность как основа DevOps-подхода</h2>
</div>
<div class="education-grid">
<article class="education-card reveal">
<span class="summary-label">2024 — 2026</span>
<h3>10.04.01 Информационная безопасность</h3>
<p class="education-school">Юго-Западный государственный университет</p>
<p>Магистратура, факультет цифровых технологий. Фокус на защите инфраструктуры, изоляции сред и
безопасной эксплуатации информационных систем.</p>
</article>
<article class="education-card reveal">
<span class="summary-label">2020 — 2024</span>
<h3>10.03.01 Информационная безопасность</h3>
<p class="education-school">Юго-Западный государственный университет</p>
<p>Бакалавриат, факультет фундаментальной и прикладной информатики. База по сетям, Linux,
безопасности приложений и администрированию.</p>
</article>
<article class="education-card reveal">
<span class="summary-label">Рабочий фокус</span>
<h3>DevSecOps</h3>
<p>Принцип наименьших привилегий, изоляция сред, контроль секретов, сетевой периметр и
наблюдаемость как часть безопасности.</p>
</article>
</div>
</section>
</main>
<footer class="footer">
<div class="section-shell footer-grid">
<div>
<strong>Зуев Егор Алексеевич</strong>
<span>Junior DevOps / Infrastructure Engineer</span>
</div>
<div class="footer-links">
<a href="mailto:ez@e-zuev.ru">ez@e-zuev.ru</a>
<a href="https://t.me/ZuevEA" target="_blank" rel="noopener noreferrer">@ZuevEA</a>
<span>Курск / удаленно</span>
</div>
</div>
</footer>
<div class="toast" id="toast" role="status" aria-live="polite">Скопировано</div>
<script src="script.js"></script>
</body>
</html>