Перейти к содержанию

DevOps Quickstart

Руководство для нового DevOps-инженера ShivaVPN. Рассчитано на 3 дня.


День 1 — Доступы и репозитории

1.1 Получить доступы

Сервис URL Как получить
GitLab https://git.karmann.tech Написать zardes — email для регистрации
Vaultwarden https://vault.shivavpn.io Зарегистрироваться, написать zardes для подтверждения
Grafana https://monitor.karmann.tech Логин/пароль: Vaultwarden → Monitoring → Grafana
Admin Panel http://10.99.87.64 Логин/пароль: Vaultwarden → Infrastructure → Admin Panel
Telegram Попросить добавить в рабочие чаты (Max или zardes)

1.2 SSH-ключи

# Создать ключ для инфраструктуры (если нет)
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_shivavpn -C "shivavpn-devops"

# Добавить в SSH agent
ssh-add ~/.ssh/id_ed25519_shivavpn

# Показать публичный ключ (добавить в GitLab + сообщить zardes для доступа к серверам)
cat ~/.ssh/id_ed25519_shivavpn.pub

Добавить публичный ключ в GitLab: Settings → SSH Keys.

Список всех SSH-ключей: Доступ и SSH.

1.3 Клонировать репозитории

# Основная документация (этот wiki)
git clone git@git.karmann.tech:devops/documentation.git shivavpn-docs

# Monorepo (основной рабочий репозиторий — документация, скрипты, планы)
git clone git@git.karmann.tech:vpn/docs.git shivavpn

# Ansible (управление инфраструктурой)
git clone git@git.karmann.tech:devops/shiva-ansible.git

# VPN Config Service (Python FastAPI + worker)
git clone git@git.karmann.tech:vpn/vpn-config-service.git

1.4 Настроить Ansible vault

cd shiva-ansible/

# Получить vault password от zardes и сохранить:
echo "VAULT_PASSWORD_HERE" > .vault_pass
chmod 600 .vault_pass

# Проверить — должно расшифроваться без ошибок
ansible-vault view inventory/group_vars/vault.yml

1.5 Проверить SSH-доступ к внутренней сети

cd shivavpn/  # monorepo

# Проверить подключение
./scripts/ssh-internal.sh 10.99.87.249 "docker ps --format '{{.Names}}'"
./scripts/ssh-internal.sh 10.99.87.62 "docker exec vpn-db mysql -uvpn -p'$(см. Vaultwarden  Databases)' vpn -e 'SELECT 1'"

Пароль MySQL: Vaultwarden → Databases → MySQL PROD.


День 2 — Понять архитектуру

2.1 Прочитать обязательные документы

В таком порядке:

  1. Обзор инфраструктуры — общая схема, серверы, провайдеры
  2. IP-адреса — все внутренние и публичные IP
  3. Конфигурация сервисов — контейнеры, порты
  4. Доступ и SSH — ключи, скрипты, ~/.ssh/config

2.2 Изучить мониторинг

Открыть Grafana:

  • Дашборд vpn-fleet-overview — общее состояние парка серверов
  • Дашборд vpn-operations — ошибки sync, состояние worker
  • Дашборд business-executive — метрики бизнеса
  • Раздел Alerting — текущие и исторические алерты

Подробнее: Мониторинг.

2.3 Понять Config Delivery Flow

Пользователь запрашивает VPN-конфиг
  → Backend (Spring Boot) проверяет аккаунт в MySQL
  → Запрашивает конфиг у VPN Config Service (HTTP)
  → VCS отдаёт из PostgreSQL кэша (данные собранные с XUI через SSH)
  → Backend формирует VLESS URL и отдаёт клиенту

Детальнее: Config Delivery Flow.

2.4 Посмотреть живое состояние

# Что сейчас запущено на backend сервере
./scripts/ssh-internal.sh 10.99.87.249 "docker ps"

# Последние логи VCS worker
./scripts/ssh-internal.sh 10.99.87.249 "docker logs vpn-config-worker --tail 30"

# Backend health
curl -s http://10.99.87.249:8080/actuator/health

# Количество активных серверов
curl -s http://10.99.87.249:8000/api/v1/stats -H "X-API-Key: KEY" | python3 -m json.tool

День 3 — Практика

3.1 Запустить Ansible с --check

cd shiva-ansible/

# Проверить доступность всех серверов
ansible -i inventory/servers.ini all -m ping

# Запустить playbook в dry-run режиме (не меняет ничего)
ansible-playbook -i inventory/servers.ini playbooks/vpn.yml --check

3.2 Выполнить ежедневную проверку

Выполнить процедуры из Основных задач.

3.3 Изучить скрипты

В monorepo: DevOps скрипты — полный каталог с описанием и примерами.

Ключевые скрипты (monorepo: scripts/):

Скрипт Назначение
ssh-internal.sh SSH к внутренним серверам через jump host
audit_account.py Полная диагностика аккаунта пользователя
check_vpn_server.py Проверка состояния VPN сервера (10 проверок)
inventory_reconcile.py Аудит инвентаря Ansible ↔ MySQL ↔ VCS

3.4 Изучить runbooks

Прочитать Runbooks — аварийные процедуры на все случаи (API упал, Redis, диск, DDoS, деплой, откат).


Команда

Человек Роль Контакт
zardes (Konstantin) DevOps Lead — инфраструктура, деплой, backend Telegram @zardes
Max Product Owner — бизнес-решения, приоритеты Telegram
Nikita Ops — доступ к инфраструктуре, провайдеры Telegram

Правила работы

  • Все изменения в production — через CI/CD (не вручную)
  • Перед любым изменением — читать существующие доки
  • Коммиты — короткие, человеческие (без AI-стиля)
  • Новые скрипты — проверить каталог скриптовscripts/README.md в monorepo)
  • Пароли — только Vaultwarden, никогда в git

Инструменты

Инструмент Назначение URL / команда
Grafana Мониторинг, алерты https://monitor.karmann.tech
GitLab Репозитории, CI/CD https://git.karmann.tech
Vaultwarden Пароли и секреты https://vault.shivavpn.io
Ansible IaC, деплой серверов cd shiva-ansible && ansible-playbook ...
ssh-internal.sh SSH к внутренним серверам ./scripts/ssh-internal.sh 10.99.87.249
Серверный инвентарь servers.ini в shiva-ansible ansible -i inventory/servers.ini vpn -m ping

Следующие шаги