🔐 Teleport — Документация для QA

Полное руководство по работе с Teleport, PgWeb, Dev DB и Backend Admin

Содержание: 1. Обзор инфраструктуры 2. Подключение к Teleport 3. PgWeb — SQL-запросы к review веткам 4. Dev DB — прямой доступ к PostgreSQL 5. Backend Admin — панель управления 6. Сервисы на каждой review ветке 7. Текущие review ветки 8. DS-828 — Воспроизведение бага 9. Для Confluence 10. Для Qase

1. Обзор инфраструктуры

Teleport — прокси-сервер для безопасного доступа к внутренним ресурсам ChatPlace в Kubernetes кластере main-cluster.

ПараметрЗначение
Proxy URLt.chatplace.io:443
Usern-kazakova-qa
Ролиdev-access qa review-access
Сессия8 часов
AuthПароль + OTP (TOTP)
VPNОбязателен (Shadowsocks → SOCKS5 127.0.0.1:1080)
Два способа доступа к базе данных:
СпособКогда использоватьОсобенности
PgWeb (через Teleport) Запросы к БД конкретной review ветки REST API, отдельная БД для каждого MR, сертификаты tsh
Dev DB (напрямую) Запросы к общей dev базе psql через proxychains, один общий сервер, ~1800 компаний

2. Подключение к Teleport

Шаг 1. Запуск VPN (Shadowsocks)

# Проверить, работает ли уже
ss -tlnp | grep 1080

# Если нет — запустить
/tmp/sslocal -c /tmp/ss-config.json &

# Конфиг: /tmp/ss-config.json
# Method: 2022-blake3-aes-256-gcm (только shadowsocks-rust!)
# Бинарник: /tmp/sslocal (с github.com/shadowsocks/shadowsocks-rust)

Шаг 2. Логин в Teleport (интерактивный)

export HTTPS_PROXY=socks5://127.0.0.1:1080
export ALL_PROXY=socks5://127.0.0.1:1080

tsh login --proxy=t.chatplace.io:443 --user=n-kazakova-qa --auth=local
# → Enter password → OTP код (30 сек жизни)
⚠️ OTP-коды живут 30 секунд — вводить сразу, как сессия попросит!

Шаг 3. Проверка

tsh status
# Должно показать: Logged in as: n-kazakova-qa, Valid for 8h

3. PgWeb — SQL-запросы к review веткам

Что это?

PgWeb v0.17.0 — веб-интерфейс для PostgreSQL. Каждая review ветка имеет свой экземпляр PgWeb с изолированной базой данных.

Доступ через TLS-сертификаты, выданные Teleport.

3.1 Логин в PgWeb ветки

# Пример для api-1764
export HTTPS_PROXY=socks5://127.0.0.1:1080
tsh apps login backend-pgweb-chatplace-api-XXXX-review-main-cluster

# Сертификаты автоматически сохраняются в ~/.tsh/keys/

3.2 API-запросы

# Переменные (подставить нужный номер ветки)
BRANCH=1764
APP="backend-pgweb-chatplace-api-${BRANCH}-review-main-cluster"
CERT="$HOME/.tsh/keys/t.chatplace.io/n-kazakova-qa-app/main/${APP}.crt"
KEY="$HOME/.tsh/keys/t.chatplace.io/n-kazakova-qa-app/main/${APP}.key"
BASE="https://${APP}.t.chatplace.io"
export HTTPS_PROXY=socks5://127.0.0.1:1080

3.3 Доступные эндпоинты PgWeb

EndpointОписаниеПример
GET / Веб-интерфейс (HTML) curl --cert $CERT --key $KEY $BASE/
GET /api/info Версия PgWeb, настройки curl --cert $CERT --key $KEY $BASE/api/info
GET /api/schemas Список схем Возвращает ["public"]
GET /api/query?query=... Выполнить SQL (GET) curl --cert ... "$BASE/api/query?query=SELECT+1"
POST /api/query Выполнить SQL (POST, для длинных) curl --cert ... --data-urlencode "query=SELECT ..." $BASE/api/query

3.4 Примеры SQL-запросов через PgWeb

# Список таблиц
curl -s --cert "$CERT" --key "$KEY" \
  "$BASE/api/query" \
  --data-urlencode "query=SELECT tablename FROM pg_tables WHERE schemaname='public' ORDER BY tablename"

# Структура таблицы
curl -s --cert "$CERT" --key "$KEY" \
  "$BASE/api/query" \
  --data-urlencode "query=SELECT column_name, data_type FROM information_schema.columns WHERE table_name='companies' ORDER BY ordinal_position"

# Произвольный запрос
curl -s --cert "$CERT" --key "$KEY" \
  "$BASE/api/query" \
  --data-urlencode "query=SELECT id, email FROM users LIMIT 5"
ℹ️ Ответ PgWeb: {"columns": [...], "rows": [[...], ...], "stats": {...}}
⚠️ GET /api/tables возвращает 404 в данной версии! Используйте SQL-запрос pg_tables вместо этого.

4. Dev DB — прямой доступ к PostgreSQL

Общая dev-база (все review ветки видят одни данные)
ПараметрЗначение
Host34.175.47.255
Port5432
Usernatasha_qa
Databasechatplace
SSLrequire
AccessREAD-ONLY
Таблиц~203
Компаний~1797

4.1 Подключение

# Через proxychains (VPN должен работать)
proxychains4 -q -f /tmp/proxychains-local.conf psql \
  "host=34.175.47.255 port=5432 user=natasha_qa \
   password=ftb76RV657BTIGBYUf687ugyt \
   dbname=chatplace sslmode=require"

# Одиночный запрос (без интерактивного режима)
proxychains4 -q -f /tmp/proxychains-local.conf psql \
  "host=34.175.47.255 ..." -t -c "SELECT count(*) FROM users"
ТОЛЬКО SELECT! Никаких INSERT/UPDATE/DELETE без явного разрешения.

4.2 Ключевые таблицы для QA

ТаблицаОписаниеКлючевые поля
companiesКомпании (проекты)ai_action_usage_limit, ai_action_next_payment_at, ai_action_last_reset_at
subscription_logsЛоги подписокuser_id, type (1-12), payment_count, created_at
subscriptionsПодписки (Stripe)user_id, type, stripe_status, ends_at
plansТарифные планыname, label, price, configuration
user_plansСвязь юзер↔планuser_id, plan_id, company_id, quantity
paymentsПлатежи-
ai_actions_historyИстория AI-запросов-
ai_action_pending_paymentsОжидающие AI-платежиcompany_id, status, actions_count

4.3 subscription_logs types

typeКол-во (dev)Предполагаемое значение
1395Создание подписки
2348Обновление подписки
3795Ежемесячное начисление AI-кредитов
4829Продление подписки
5276Изменение плана
6177Отключение доп. функции
7304Включение доп. функции
8263Ручной сброс токенов
9372Применение промокода
105Специальное событие
11277Изменение количества аккаунтов
1210Миграция

5. Backend Admin — панель управления

Админ-панели доступны для каждой review ветки и для dev

backend-admin-chatplace-dev-main-cluster.t.chatplace.io

ПараметрЗначение
Emailnpkazakova@gmail.com
PasswordhTulILr7zhX4Vd5Q
ИсточникКонстантин Девяткин (Slack, Feb 26)
⚠️ На dev-main-cluster логин редиректит обратно (возможно, нужна другая учётка или свежий CSRF). На review ветках работает через Teleport-сертификаты.

5.1 Логин в админку review ветки

export HTTPS_PROXY=socks5://127.0.0.1:1080
tsh apps login backend-admin-chatplace-api-XXXX-review-main-cluster

# Открыть в браузере (через tsh proxy)
# или curl с сертификатами:
CERT="$HOME/.tsh/keys/t.chatplace.io/n-kazakova-qa-app/main/backend-admin-chatplace-api-XXXX-review-main-cluster.crt"
KEY="$HOME/.tsh/keys/t.chatplace.io/n-kazakova-qa-app/main/backend-admin-chatplace-api-XXXX-review-main-cluster.key"
curl -s --cert "$CERT" --key "$KEY" https://backend-admin-chatplace-api-XXXX-review-main-cluster.t.chatplace.io/

6. Сервисы на каждой review ветке

🖥 backend

Основное API приложение. Порт 80.

api-XXXX.review.chatplace.io

⚙️ backend-admin

Панель управления (Laravel). Порт 80.

Подписки, планы, юзеры, AI-кредиты

📊 backend-dashboard

Dashboard-сервис. Порт 80.

🗄 backend-pgweb

PgWeb — SQL к БД ветки. Порт 8081.

REST API: /api/query

🔗 backend-webhook

Обработка вебхуков. Порт 80.

Stripe, Telegram, внешние интеграции

🤖 backend-mcp

MCP (Model Context Protocol). Порт 80.

Доступен не на всех ветках (13 из 20)

7. Текущие review ветки

На данный момент (01.04.2026) доступно 20 review веток + 1 dev:

#API BranchPgWebMCPПримечание
11080
21368
31422
41617Нет PgWeb
51698AmoCRM тесты (DS-650 старое)
61733
71764GCal + DS-650 текущий
81769
91778
101784
111833
121844
131868
141944
152020
162022
172024
182054
192063
202069
devОбщая dev-среда

8. DS-828 — Воспроизведение бага

🐛 Проблема: не приходят вовремя AI-токены на годовом тарифе

Суть: У пользователей с годовой подпиской (Pro Year) ежемесячное начисление AI-кредитов (subscription_logs type=3) иногда пропускается.

Причина (по Антону): Часть старых амбассадоров не попала в миграцию. Плюс баг с промокодом — дата не проставлялась (исправлен в феврале 2026).

Решение: В админке → раздел «Подписки» → кнопка «Дата сброса» у ИИ-запросов — проставить нужную дату.

8.1 Скриншот из задачи

На скриншоте — Backend Admin → Планы конкретного пользователя:

ПланКол-воПлатёжная системаСлед. списаниеДействия
ChatPlace ИИ1Удалить
Pro1Cloudpayments12 Apr 2026, 07:55Изменить дату / Отменить
Аккаунты4Изменить кол-во
ИИ-запросы11 941 / 11 941Изменить кол-во / 🔴 Дата сброса

🔴 Красная рамка обведена вокруг кнопки «Дата сброса» — именно её Антон добавил для ручного исправления даты ежемесячного сброса AI-токенов.

8.2 Воспроизведение через SQL (Dev DB)

# Пример: rustam.chatplace@gmail.com — пропуски в ежемесячных начислениях (type=3)
proxychains4 -q -f /tmp/proxychains-local.conf psql "..." -t -c "
SELECT sl.type, sl.payment_count, to_char(sl.created_at, 'YYYY-MM') as month
FROM subscription_logs sl
JOIN users u ON u.id = sl.user_id
WHERE u.email = 'rustam.chatplace@gmail.com' AND sl.type = 3
ORDER BY sl.created_at
"

8.3 Результат — видны пропуски

Месяцtype=3?payment_count
2024-102
2024-113
2024-12❌ ПРОПУСК
2025-015
2025-026
2025-03❌ ПРОПУСК
2025-048
2025-059
2025-06❌ ПРОПУСК
2025-0711
2025-0812
2025-09❌ ПРОПУСК
2025-1013
2025-11 — 2026-03❌ ПРОПУСК × 5
📊 Паттерн: Начисления идут через месяц (каждый 2-й пропускается), а с ноября 2025 — прекратились совсем.

8.4 Дополнительные проверки

# Все компании с ai_action_next_payment_at = NULL (дата сброса не установлена)
proxychains4 -q -f /tmp/proxychains-local.conf psql "..." -t -c "
SELECT count(*) as total,
       count(ai_action_next_payment_at) as with_next_payment,
       count(ai_action_last_reset_at) as with_last_reset
FROM companies
"
# Результат: 1797 всего, 0 с next_payment, 299 с last_reset
# → ai_action_next_payment_at = NULL у ВСЕХ компаний на dev!
🔴 ai_action_next_payment_at = NULL у всех 1797 компаний на dev! Если cron/job ориентируется на это поле — начисления не происходят.

8.5 Как воспроизвести через админку

  1. Открыть Backend Admin (dev)
  2. Войти (npkazakova@gmail.com / hTulILr7zhX4Vd5Q)
  3. Найти пользователя по email (например rustam.chatplace@gmail.com)
  4. Перейти в раздел «Планы»
  5. Увидеть строку «ИИ-запросы» с кнопкой «Дата сброса»
  6. Если дата не установлена — это причина пропуска начислений

9. Для Confluence

📖 Рекомендуемая страница: «QA — Доступ к инфраструктуре»
Markdown-текст для Confluence
# QA — Доступ к инфраструктуре ChatPlace

## Teleport (t.chatplace.io)
- **Proxy:** t.chatplace.io:443
- **Auth:** пароль + OTP (TOTP)
- **Сессия:** 8 часов
- **Требуется VPN** (Shadowsocks SOCKS5)

### Доступные сервисы на каждой review ветке
| Сервис | Порт | Назначение |
|--------|------|------------|
| backend | 80 | API |
| backend-admin | 80 | Админ-панель |
| backend-dashboard | 80 | Dashboard |
| backend-pgweb | 8081 | SQL-доступ к БД |
| backend-webhook | 80 | Вебхуки |
| backend-mcp | 80 | MCP (не на всех) |

### PgWeb — SQL-запросы
```
tsh apps login backend-pgweb-chatplace-api-{BRANCH}-review-main-cluster
curl --cert $CERT --key $KEY "$BASE/api/query" --data-urlencode "query=SELECT ..."
```

### Dev DB (прямой доступ)
- Host: 34.175.47.255:5432
- Database: chatplace
- Доступ: READ-ONLY через proxychains

### Ключевые таблицы
- `companies` — проекты, AI-лимиты
- `subscription_logs` — логи подписок (type 1-12)
- `user_plans` — привязка юзер↔план
- `ai_action_pending_payments` — ожидающие AI-платежи

10. Для Qase

🧪 Тест-кейсы для инфраструктуры
Предложения по тест-кейсам

Suite: «Инфраструктура / Teleport»

IDTitlePriority
TC-1Подключение к Teleport через VPN + OTPHigh
TC-2PgWeb: выполнение SELECT-запроса к review веткеHigh
TC-3Dev DB: подключение через proxychainsHigh
TC-4Backend Admin: логин и навигацияMedium
TC-5Backend Admin: просмотр подписок пользователяMedium
TC-6Backend Admin: кнопка «Дата сброса» AI-токеновHigh

Suite: «Подписки / AI-кредиты»

IDTitlePriority
TC-7Ежемесячное начисление AI-кредитов (type=3) на годовом тарифеCritical
TC-8Поле ai_action_next_payment_at заполнено для активных подписокCritical
TC-9Ручной сброс даты через админку (Дата сброса)High
TC-10Промокод не обнуляет ai_action_next_payment_atHigh
Документация подготовлена 01.04.2026 · Teleport сессия: n-kazakova-qa · Данные: dev DB + PgWeb api-1764