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

Доступы и SSH

Архитектура сети

graph LR
    Dev[Разработчик] -->|SSH :2255| Proxy[212.70.189.60<br>Jump Host]
    Proxy -->|SSH| Backend[10.99.87.249<br>Backend]
    Proxy -->|SSH| MySQL[10.99.87.62<br>MySQL]
    Proxy -->|SSH| Admin[10.99.87.64<br>Admin Panel]
    Proxy -->|SSH| Grafana[10.99.87.5<br>Grafana]
    Dev -->|SSH direct| VPN[VPN серверы<br>публичные IP]

Внутренние серверы (10.99.87.*) доступны только через jump host 212.70.189.60:2255.

Получение SSH ключа

Для доступа к серверам нужен ключ id_ed25519_shivavpn. Как получить:

  1. Сгенерировать (если нет ключа):

    ssh-keygen -t ed25519 -C "your-name@shivavpn-devops" -f ~/.ssh/id_ed25519_shivavpn
    

  2. Отправить публичный ключ DevOps Lead (zardes):

    cat ~/.ssh/id_ed25519_shivavpn.pub
    

  3. DevOps Lead добавит ключ в Ansible (inventory/group_vars/all.ymlroot_public_keys) и прогонит:

    ansible-playbook -i inventory/servers.ini playbooks/ssh.yml --vault-password-file .vault_pass
    

  4. Настроить SSH config (~/.ssh/config):

    Host shivavpn-proxy
      HostName 212.70.189.60
      Port 2255
      User root
      IdentityFile ~/.ssh/id_ed25519_shivavpn
      IdentitiesOnly yes
    

  5. Проверить:

    ssh shivavpn-proxy hostname  # должен вернуть "karman"
    

Важно

Без SSH ключа в Ansible inventory — доступ только к jump host. Попросить zardes добавить ключ в root_public_keys.

Скрипт ssh-internal.sh

Основной способ доступа к внутренней сети:

# Интерактивная сессия
./scripts/ssh-internal.sh 10.99.87.62

# Выполнить команду
./scripts/ssh-internal.sh 10.99.87.249 "docker ps"

# MySQL запрос (пароль в [Vaultwarden](https://vault.shivavpn.io))
./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db mysql -uvpn -p'$(см. Vaultwarden  Databases)' vpn -e 'SELECT COUNT(*) FROM account'"

Внутренняя сеть

IP Сервер Сервисы
10.99.87.249 Backend PROD vpn-back (blue/green), vpn-config-service, remnawave, redis
10.99.87.62 MySQL PROD vpn-db (MySQL 8.0)
10.99.87.64 Admin Panel vpn-admin (Next.js)
10.99.87.5 Monitoring Grafana, Prometheus, Loki, Audit Bot
10.99.87.63 Frontend vpn-front, vpn-lk, partner lands, redis (standby)
10.99.87.2 Proxy nginx (сам jump host 212.70.189.60)

SSH ключи

Ключ Назначение
~/.ssh/id_ed25519_shivavpn VPN серверы (XUI) + внутренняя сеть
~/.ssh/id_ed25519_hiddify Remnawave ноды (бывшие Hiddify серверы)
~/.ssh/id_ed25519_vpn_config_service Worker SSH к серверам (на 10.99.87.249)
~/.ssh/id_ed25519 Инфраструктура общая
~/.ssh/vk_rsa VK Cloud (только RSA, ED25519 не поддерживается)

IdentitiesOnly

Всегда используй IdentitiesOnly=yes при SSH к VPN серверам, чтобы SSH agent не предлагал неправильные ключи:

ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519_shivavpn root@<IP>

SSH Config (опционально)

Для удобства можно добавить в ~/.ssh/config:

# Jump host
Host shiva-proxy
  HostName 212.70.189.60
  Port 2255
  User root
  IdentityFile ~/.ssh/id_ed25519_shivavpn

# Internal servers
Host shiva-backend
  HostName 10.99.87.249
  User root
  ProxyJump shiva-proxy
  IdentityFile ~/.ssh/id_ed25519_shivavpn

Host shiva-mysql
  HostName 10.99.87.62
  User root
  ProxyJump shiva-proxy
  IdentityFile ~/.ssh/id_ed25519_shivavpn

Host shiva-admin
  HostName 10.99.87.64
  User root
  ProxyJump shiva-proxy
  IdentityFile ~/.ssh/id_ed25519_shivavpn

Host shiva-grafana
  HostName 10.99.87.5
  User root
  ProxyJump shiva-proxy
  IdentityFile ~/.ssh/id_ed25519_shivavpn

После настройки:

ssh shiva-backend "docker ps"
ssh shiva-mysql

SCP через jump host

# Копирование файла на внутренний сервер
scp -o ProxyJump="root@212.70.189.60:2255" \
  -i ~/.ssh/id_ed25519_shivavpn \
  file.txt root@10.99.87.5:/path/

# Копирование с внутреннего сервера
scp -o ProxyJump="root@212.70.189.60:2255" \
  -i ~/.ssh/id_ed25519_shivavpn \
  root@10.99.87.249:/opt/file.txt ./

Shell функция (опционально)

Добавь в ~/.zshrc или ~/.bashrc для быстрого доступа:

function shiva() {
  case $1 in
    mysql|db)
      ssh -p 2255 -i ~/.ssh/id_ed25519_shivavpn root@212.70.189.60 \
        "ssh -i ~/.ssh/id_ed25519_shivavpn root@10.99.87.62 '${@:2}'"
      ;;
    backend|api)
      ssh -p 2255 -i ~/.ssh/id_ed25519_shivavpn root@212.70.189.60 \
        "ssh -i ~/.ssh/id_ed25519_shivavpn root@10.99.87.249 '${@:2}'"
      ;;
    admin)
      ssh -p 2255 -i ~/.ssh/id_ed25519_shivavpn root@212.70.189.60 \
        "ssh -i ~/.ssh/id_ed25519_shivavpn root@10.99.87.64 '${@:2}'"
      ;;
    *)
      echo "Usage: shiva [mysql|backend|admin] [command]"
      ;;
  esac
}

Использование:

shiva mysql                        # Интерактивная сессия к MySQL
shiva mysql "docker ps"            # Команда на MySQL сервере
shiva backend "docker ps --format table"
shiva admin

VPN серверы (прямой доступ)

VPN серверы имеют публичные IP и доступны напрямую:

# XUI серверы
ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519_shivavpn root@<VPN_IP>

# Remnawave ноды
ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519_hiddify root@<NODE_IP>

Инвентарь серверов: см. Серверы и инвентарь (будет добавлен).

GitLab репозитории

Проект ID URL
Backend 33 git.karmann.tech:vpn/back
Admin Frontend 39 git.karmann.tech:vpn/group-frontend/admin-front
VPN Config Service 55 git.karmann.tech:vpn/vpn-config-service
Audit Bot 56 git.karmann.tech:vpn/audit-bot
User Bot 58 git.karmann.tech:vpn/telegram-user-bot
Desktop (наш форк) 59 git.karmann.tech:vpn/desktop-alpha
Документация 60 git.karmann.tech:devops/documentation

Desktop — критическое правило

НАШ репо: desktop-alpha (project 59) — сюда пушим всё. ОРИГИНАЛ: desktop (project 38) — НИКОГДА не трогать, не пушить, не делать MR.

Пароли

Все пароли хранятся в Vaultwarden. Никогда не коммитить пароли в git.

Скрипты из monorepo подтягивают credentials автоматически из локального файла credentials/CREDENTIALS.md (git-ignored). Подробнее: DevOps скрипты.