Доступы и 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. Как получить:
-
Сгенерировать (если нет ключа):
-
Отправить публичный ключ DevOps Lead (zardes):
-
DevOps Lead добавит ключ в Ansible (
inventory/group_vars/all.yml→root_public_keys) и прогонит: -
Настроить SSH config (
~/.ssh/config): -
Проверить:
Важно
Без 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 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
После настройки:
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 скрипты.