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

Архыз.CLUB — все ссылки и доступы

Назначение: единая точка входа для разработчика. Здесь все URL, креды, IP, демо-аккаунты, инструменты мониторинга. Документ обновляется по факту изменений в infra/routes.config.mjs / docker-compose*.yml / .env.production.


1. Прод-фронтенды

Роль / Назначение URL Контейнер
👤 Турист (главная) https://arkhyz-club.ru arkhyz-tourist-app (nginx, port 80)
🔧 Админ + многороле SPA https://admin.arkhyz-club.ru arkhyz-admin-web-v4 (nginx)
📱 Tourist mobile app (web build) https://app.arkhyz-club.ru tourist-app (тот же, alias)
🏨 Отельер ЛК https://hotel.arkhyz-club.ru arkhyz-hotelier-web
🍽️ Ресторатор ЛК https://restaurant.arkhyz-club.ru arkhyz-restaurant-web
🚖 Трансфер-провайдер ЛК https://transfer.arkhyz-club.ru arkhyz-transfer-web
🎿 Инструктор ЛК https://instructor.arkhyz-club.ru arkhyz-instructor-web
🌍 Туроператор ЛК https://touroperator.arkhyz-club.ru arkhyz-touroperator-web
🧪 Stage / preview https://stage.arkhyz-club.ru те же контейнеры, отдельный домен
🔌 Public API https://api.arkhyz-club.ru hotel_api_v2 + микросервисы

SPA-роутинг внутри admin.arkhyz-club.ru: - /admin/* — админка - /hotelier/* — кабинет отельера (тот же SPA, role-based) - /restaurateur/* — кабинет ресторатора - /instructor/*, /tour-operator/*, /transfer-provider/* - /tourist/* — фолбэк туристский UI (для админа в режиме «глазами туриста»)


2. Backend сервисы

Сервис Где живёт Назначение
hotel_api_v2 (monolith) api-admin/app/ Legacy FastAPI — auth, bookings, /admin/*, отчёты
auth-svc services/auth-svc/ SMS-логин (/auth/sms/send-code / verify-code), tokens
catalog-svc services/catalog-svc/ Каталог hotels/tours/restaurants/transfers/instructors/companies
booking-svc services/booking-svc/ Commission-first брони (5 типов услуг), /admin/commissions/*, refunds
resort-svc services/resort-svc/ GPS-трекинг, ski-pass, lifts, weather, leaderboard
chat-svc services/chat-svc/ Чат, поддержка, отзывы
rtc-svc services/rtc-svc/ WebSocket realtime, calls, SOS
analytics-svc services/analytics-svc/ События, dashboard метрики
platform-svc services/platform-svc/ Уведомления, settings, files, push
social-svc services/social-svc/ Favorites, social-graph
stories-svc services/stories-svc/ Истории туристов
gamification-svc services/gamification-svc/ Бейджи, прогресс, leaderboard
pass-svc services/pass-svc/ Ski-pass: /pass/* + alias /ski-pass/*, scans
arkhyzpay-api (/opt/arkhyzpay/) Т-Банк escrow gateway (номинальный счёт)
livekit (image livekit/livekit-server:v1.7) OSS WebRTC SFU для голосовых беседок
livekit-egress (image livekit/egress:v1.8) Запись голосовых каналов в S3 (opus/ogg)
coturn (image coturn/coturn) TURN для звонков 1-на-1
error-collector (custom) Sentry-lite, принимает envelope от sdk → SQLite
telegram-relay (systemd unit arkhyz-telegram-relay) Alertmanager → Telegram алерты (нужен VPN)

Все health-эндпоинты: GET https://<service>:8000/health (HEAD тоже работает с 29cfabfc4).

Платежи (PSP routing)

Все 6 точек создания платежей в booking-svc идут через единый router services/booking-svc/app/psp.py: 1. Restaurant commission (legacy_booking_compat.py:507) 2. Tour / Transfer / Instructor / Hotel commission (_finalize_commission_response) 3. Legacy manual repay (routers/payments.py /payments/process)

Выбор провайдера: - payment_settings.provider (per-owner override) → yookassa | arkhyzpay - public.settings.payment_provider_default (глобальный default, по умолчанию yookassa) - Fallback на yookassa

Voice recording (Phase R-voice)

Flow: 1. Пользователь в беседке нажимает 🎙 Голосовой каналPOST /forums/{id}/voice/token → join LiveKit room besedka-<forum_id> 2. Инициатор/автор темы жмёт ● ЗаписьPOST /forums/{id}/voice/recording/start → backend через twirp StartRoomCompositeEgress ставит задание в Redis → Egress воркер забирает → ffmpeg → opus/ogg → S3 3. POST /forums/{id}/voice/recording/stopStopEgress твирп 4. По завершению — LiveKit webhook egress_ended → backend заполняет forum_voice_rooms.recording_url, recording_duration_s 5. GET /forums/{id}/voice/recordings → список с URL для воспроизведения

Конфиг: - infra/livekit/livekit.yaml — webhook на /api/v1/forums/voice/webhook, общий Redis для job queue - infra/livekit/egress.yaml — Redis + S3 (TWC ru-1) + ws_url to livekit - Env vars (.env.prod): LIVEKIT_API_KEY/SECRET, LIVEKIT_EGRESS_URL=http://livekit:7880, LIVEKIT_RECORDINGS_BUCKET=<S3>, S3_*

GDPR / 152-ФЗ endpoints (api-admin)

Endpoint Метод Что делает
/api/v1/me/export GET Экспорт всех ПД пользователя (профиль, брони, платежи, чаты) → JSON blob
/api/v1/me DELETE Удаление аккаунта: ПД обезличиваются, бронирования/платежи остаются (бухучёт)
/api/v1/me/consent POST Аудит согласия на обработку ПД (версия политики, IP, время)

3. Supabase (self-hosted)

Что URL / Доступ
Public API (PostgREST + Realtime + Storage + Auth + Edge Fn) https://supabase.arkhyz-club.ru
Studio (GUI) https://studio.arkhyz-club.ru
Kong proxy port (intra-network) kong:9600 (внутри arkhyz_supa_net)
Anon JWT (в .env.production) eyJhbGciOiJIUzI1NiIsIn...c5GNT1f-QqL-eORfVz970
Service Role JWT в env SERVICE_ROLE_KEY (только на сервере)
Postgres DB arkhyz-supabase-db:5432 (внутри docker, нет внешнего port)
PostgreSQL credentials user postgres, password в .env.prodPOSTGRES_PASSWORD

Edge Functions: - Папка: supabase/functions/<name>/index.ts - Деплой: gh workflow run deploy-supabase-functions.yml - Endpoint: https://supabase.arkhyz-club.ru/functions/v1/<name> - ⚠️ Известный баг self-hosted edge-runtime: ERR_MODULE_NOT_FOUND для bind-mount функций. Для критичных функций используем RPC bypass (см. BookingInlineDateRange.tsx как пример).


4. Мониторинг и логи

Что URL Auth
🔥 Self-hosted Sentry (error-collector) https://errors.arkhyz-club.ru внутренний токен (DSN в env SENTRY_DSN)
📊 Monitor gateway (Grafana / Prometheus / Alertmanager) https://monitor.arkhyz-club.ru basic-auth: admin / Arkhyz_monitor_2026!
Grafana панели через monitor.arkhyz-club.ru то же basic-auth
Prometheus targets через monitor.arkhyz-club.ru/prometheus то же
pgAdmin (БД GUI) контейнер arkhyz-pgadmin (не expose'нут наружу) env PGADMIN_DEFAULT_EMAIL / PASSWORD
ClickHouse UI контейнер arkhyz-clickhouse-ui внутренний
Superset контейнер arkhyz-superset внутренний

CLI access к логам:

ssh -i ~/.ssh/arkhyz_prod root@arkhyz-club.ru \
  "sudo docker logs --since 1h arkhyz-booking-svc 2>&1 | tail -50"


5. Демо-аккаунты (SMS-логин)

SMS-код для всех демо-номеров +79990000XXX1111 (backdoor в auth-svc).

Роль Email Phone Пароль (если по email)
Турист tourist@arkhyz-club.ru +7 999 000 0001 123123
Админ admin@arkhyz-club.ru +7 999 000 0002 123123
Отельер hotelier@arkhyz-club.ru +7 999 000 0003 123123
Туроператор comgruztaxi@gmail.com +7 999 000 0004 123123
Трансфер transfer-provider@arkhyz-club.ru +7 999 000 0005 123123
Ресторатор restaurateur_fixed@arkhyz-club.ru +7 999 000 0006 123123
Инструктор instructor@arkhyz-club.ru +7 999 000 0007 123123

Реальный тестовый турист (с накопленной историей): - email: tourist1357@arkhyz.test, id 579e72d3-988b-497c-8ca0-bb07305b8b47 - 20 room + 16 tour + 11 restaurant + 8 transfer + 6 instructor brons


6. GitHub / CI

Что URL
Repo https://github.com/andis777/arkhyz-admin-main
Owner andis777 (User account)
Workflows https://github.com/andis777/arkhyz-admin-main/actions
Self-hosted runner arkhyz-stage (id 21, на проде)

Ключевые workflows: - auto-deploy-backend.yml — авто-деплой при push в main - admin-frontend-rebuild.yml — пересборка admin SPA - deploy-supabase-functions.yml — деплой edge functions через Supabase CLI

⚠️ CI billing: GitHub Actions на private repo требует spending limit. Если runs startup_failure за 1с — проверь https://github.com/settings/billing/spending_limit.


7. Прод-сервер (SSH)

Что Значение
Host arkhyz-club.ru (resolves автоматически)
User root
SSH ключ (локально у Roman) ~/.ssh/arkhyz_prod
Платформа контейнеров podman + docker compose wrapper
Compose файлы /root/arkhyz-admin-main/docker-compose*.yml
Deploy скрипты /root/arkhyz-admin-main/scripts/deploy-svc.sh <svc>
Marker script /usr/local/bin/arkhyz-deploy.sh <target> (marker / frontend / caddy / all)
Auto-deploy timer arkhyz-auto-deploy.timer (каждые ~30 мин, git pull + rebuild dirty)
Disk cleanup timer arkhyz-disk-cleanup.timer (Sun 03:00, journal+image+log prune)

Команды:

# Manual deploy одного сервиса
sudo bash /root/arkhyz-admin-main/scripts/deploy-svc.sh booking-svc

# Manual marker (grafana annotation)
sudo /usr/local/bin/arkhyz-deploy.sh marker

# Frontend rebuild (vite + nginx copy)
sudo /usr/local/bin/arkhyz-deploy.sh frontend

# Логи микросервиса
sudo docker logs -f --tail 100 arkhyz-booking-svc


8. Платёжные системы

Провайдер URL / Прокси Назначение
YooKassa (default) https://api.yookassa.ru/v3 Стандартный YK-flow, env YOOKASSA_SHOP_ID/SECRET_KEY
arkhyzpay (alternative) https://pay.arkhyz-club.ru (контейнеры arkhyzpay-{api,ui,postgres}) Свой шлюз через Т-Банк номинальный счёт

Переключение default: /admin/payment-settings → radio YooKassa ↔ arkhyzpay (требует admin role). Глобальный setting в public.settings.payment_provider_default.

Per-provider override: в payment_settings для каждого user_id. Поля nominal_account_bik/number/holder — для расчётов через Т-Банк.


9. Mobile app

Что Где
Source mobile/ (Expo + React Native)
Tourist Capacitor (web→APK) tourist-app/ + tourist-app/android/
APK build CI .github/workflows/tourist-apk-build.yml (self-hosted Linux runner)
APK download https://arkhyz-club.ru/tourist-app.apk (из admin_web_v4 nginx)

10. Frontend env (.env.production)

VITE_API_BASE_URL=/api/v1                       # Caddy strip → микросервисы
VITE_SUPABASE_URL=https://supabase.arkhyz-club.ru
VITE_SUPABASE_ANON_KEY=eyJ...
VITE_YAMAPS_API_KEY=45bcab79-...
VITE_FORCE_EDGE_PROXY=false                     # ⚠️ true ломает /admin/users (edge fn 502)
VITE_ENABLE_AI_SEARCH=true                      # AI поиск отелей

11. Routing (Caddy)

  • Source-of-truth: infra/routes.config.mjs
  • Генератор: node scripts/gen-routes.mjs → пишет Caddyfile, Caddyfile.prod, Caddyfile.local
  • Не править Caddyfile вручную — CI ловит git diff --exit-code после re-gen

Применение на проде:

sudo docker cp Caddyfile.prod arkhyz-caddy:/etc/caddy/Caddyfile.new
sudo docker exec arkhyz-caddy sh -c 'cat /etc/caddy/Caddyfile.new > /etc/caddy/Caddyfile && rm /etc/caddy/Caddyfile.new && caddy reload --config /etc/caddy/Caddyfile'


12. Полезные SQL / cheat-sheets

Подключение к БД с сервера:

sudo docker exec -it arkhyz-supabase-db psql -U postgres -d postgres

Список app-ролей PostgreSQL (для tourist/hotelier/admin/etc PostgREST SET ROLE):

SELECT rolname FROM pg_roles
 WHERE rolname IN ('tourist','hotelier','admin','restaurateur',
                   'instructor','tour_operator','transfer_provider')
 ORDER BY rolname;

Все pending платежи > 24h (для cleanup):

SELECT id, service_type, amount, created_at
  FROM public.payments
 WHERE status='pending' AND created_at < NOW() - INTERVAL '24 hours';

Тест endpoint'а с admin-токеном (с сервера):

TOKEN=$(curl -s -X POST "https://admin.arkhyz-club.ru/api/v1/auth/sms/verify-code" \
  -H "Content-Type: application/json" -d '{"phone":"+79990000002","code":"1111"}' \
  | python3 -c "import sys,json;print(json.load(sys.stdin).get('access_token',''))")
curl -s -H "Authorization: Bearer $TOKEN" "https://admin.arkhyz-club.ru/api/v1/admin/commissions/roles"


13. Известные ограничения / гайды

  • Edge-functions self-hosted иногда падают ERR_MODULE_NOT_FOUND (bind-mount + import_map конфликт). Решение: RPC-bypass или supabase functions deploy через CLI.
  • Kong DNS cache — после --force-recreate любого upstream'а Kong нужно reload'ить (теперь auto через deploy-svc.sh с b67f3d773).
  • Build на проде vite-build admin SPA = ~18с, tourist-app = ~3с. Если docker compose build --no-cache ронял kernel soft-lockup — RAM 8GB+ обязательно.
  • GitHub Actions billing — private repo на Free plan ограничен 2000 мин/мес. Self-hosted runners бесплатны, но при превышении лимита GitHub-hosted блокируется все, включая self-hosted (известный глюк).
  • Дискспейс — на проде 154GB volume. Auto-cleanup еженедельно (Sun 03:00). При свободном <10GB сервер уходит в kernel soft-lockup.

14. Контакты команды

Роль Лицо
Lead Dev Roman (это репо)
Деплой Roman + auto-deploy timer
Sentry alerts errors.arkhyz-club.ru → Slack/Telegram (если настроено)
Поддержка telegram @arkhyzclub_support (из platform.app_config)

Аварийный телефон (resort) (из app_config): +7 928 655 01 12


15. SECRETS (internal — приватный repo)

⚠️ Этот раздел содержит prod-секреты. НЕ копировать в публичный repo / Slack / email. Источник правды — /root/arkhyz-admin-main/.env и .env.prod на проде (ssh root@arkhyz-club.ru). При rotation любого ключа — обновлять и здесь, и на проде, и в GitHub Actions secrets.

15.1. JWT / Auth

Var Значение Где используется
JWT_SECRET / HOTEL_API_JWT_SECRET yfYOFK_U7S_63OXVpdi2Ec7REAAPRE4LrdvwzyrxZ9OSCURTSNpl5N0r5_V3EAEL auth-svc, hotel_api_v2, все микросервисы (через shared verify_jwt)
HOTEL_API_JWT_SECRET_PREV (не задан) Для graceful rotation — задать = старый ключ, новый в основную, через 30д убрать
PGRST_JWT_SECRET то же что JWT_SECRET PostgREST для verify Supabase JWT (должен совпадать с SERVICE_ROLE_KEY issuer)
SECRET_KEY_BASE arkhyz-club-super-secret-key-base-2025-production-safe-realtime-phoenix-elixir-64b Supabase Realtime (Phoenix)
SMS_CODE_PEPPER arkhyz-club-sms-pepper-2025 SMS-код хэшируется с pepper до записи в БД

15.2. Supabase

Var Значение
SUPABASE_URL (внутри prod) http://arkhyz-supabase-kong:9600
VITE_SUPABASE_URL (фронт) https://supabase.arkhyz-club.ru
ANON_KEY / SUPABASE_ANON_KEY eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNzcyMjA1MDMzLCJleHAiOjIwODc1NjUwMzN9.l81aqmPSRb8_K8Fqz8ps378VCRWOze9B94u5kggLPio
SERVICE_ROLE_KEY / SUPABASE_SERVICE_ROLE_KEY eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaXNzIjoic3VwYWJhc2UiLCJpYXQiOjE3NzIyMDUwMTEsImV4cCI6MjA4NzU2NTAxMX0.ESts_aMBE45RoYYxodb63Ivao3LGO3qzladtxtZcHyQ

15.3. Postgres

Var Значение
DATABASE_URL postgresql://postgres:postgres@arkhyz-supabase-db:5432/postgres
POSTGRES_USER / POSTGRES_PASSWORD / POSTGRES_DB postgres / postgres / postgres
PGRST_DB_URI postgres://authenticator:postgres@db:5432/postgres
pgAdmin URL http://pgadmin.arkhyz-club.ru (basic-auth admin / Arkhyz_monitor_2026!)

15.4. Redis

Var Значение
REDIS_URL (services) redis://arkhyz-redis:6379/3
REDIS_URL_CHAT redis://arkhyz-redis:6379/4
LiveKit + Egress Redis arkhyz-redis:6379 (DB 0, общий для job queue)

15.5. S3 (TWC Storage, ru-1)

Var Значение
S3_ENDPOINT_URL https://s3.twcstorage.ru
S3_REGION ru-1
S3_ACCESS_KEY_ID TGDDFE5RU55I6YC5CNA0
S3_SECRET_ACCESS_KEY oikTR9UCCNLLmDd6JWFYkdF7Gg5sQzCZSbrInBCU
S3_BUCKET_NAME 8c99fe9c-2493b678-6115-46ce-bb7e-e512138e4c9b
LIVEKIT_RECORDINGS_BUCKET то же — recordings в besedka/

Health probe: bash scripts/check-recordings-bucket.sh (cron /etc/cron.d/arkhyz-recordings-check — 04:00 daily).

15.6. LiveKit (WebRTC + Egress)

Var Значение
LIVEKIT_API_KEY APIarkhyzCSHZ3jsGN2J5
LIVEKIT_API_SECRET KMu4FR0SR-wEfdjnxTIT1Oc_SKwEKnNWQBlJqVqnoZFUd5V4qB8A9g
LIVEKIT_WS_URL (frontend) wss://livekit.arkhyz-club.ru
LIVEKIT_EGRESS_URL (backend, internal) http://livekit:7880
Webhook (LiveKit → backend) https://admin.arkhyz-club.ru/api/v1/forums/voice/webhook (HMAC по LIVEKIT_API_SECRET)

15.7. coturn (TURN/STUN)

Var Значение
TURN_EXTERNAL_IP / COTURN_HOST 85.239.53.191:3478
TURN_USER arkhyz
TURN_SECRET / COTURN_SECRET 7f68fb0b9a67970580d830a8979b23c4c938c2c0886062aa1c3f76e3c532d2cf
COTURN_TTL 3600 (1 час по TTL credentials)

15.8. Платежи

Var Значение
YOOKASSA_SHOP_ID 1172293
YOOKASSA_SECRET_KEY test_sZXmMwSMx6mCTXblQ6sHwVMYTZ6KM-uzunHRRIUjn_M (тестовый — заменить при выходе в прод)
YOOKASSA_RETURN_URL https://arkhyz-club.ru/tourist/booking-history
ARKHYZPAY_URL (internal) http://arkhyzpay-api:8090 (см. /opt/arkhyzpay/)
ARKHYZPAY_API_TOKEN (см. /opt/arkhyzpay/docker-compose.yml env — arkhyz-admin-2026-secret-key)
YK webhook IP allowlist 185.71.76.0/27, 185.71.77.0/27, 77.75.153.0/25, 77.75.156.11/32, 77.75.156.35/32, 77.75.154.128/25, 2a02:5180::/32

15.9. SMS / Email

Var Значение
SMS_RU_API_KEY 3EF8A58B-DF35-FB57-926C-9C89AA272B70
SMTP_HOST mail (internal container)
SMTP_PORT 25
SMTP_FROM Архыз.CLUB <no-reply@arkhyz-club.ru>
SMTP_REPLY_TO info@arkhyz-club.ru

15.10. OAuth (Google, Yandex)

Var Значение
GOOGLE_OAUTH_CLIENT_ID 447682621534-8an18l2sep6cfoh5h8fca8gnsf5mr213.apps.googleusercontent.com
GOOGLE_OAUTH_CLIENT_SECRET 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
GOOGLE_OAUTH_REDIRECT_URI https://arkhyz-club.ru/api/v1/auth/oauth/google/callback
YANDEX_OAUTH_CLIENT_ID 775362845c5547b4bec5ccce6b6113e3
YANDEX_OAUTH_CLIENT_SECRET 970cfeb550b34b7abc1c456ca5f0b04e
YANDEX_OAUTH_REDIRECT_URI https://arkhyz-club.ru/api/v1/auth/oauth/yandex/callback

15.11. AI / LLM (OpenRouter)

Var Значение
OPENAI_API_KEY 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
Endpoint https://openrouter.ai/api/v1
Активная модель google/gemini-2.0-flash-001 (5 AI-сервисов — см. api-admin/app/services/ai/*.py)

15.12. Карты / Геоданные

Var Значение
VITE_MAPBOX_TOKEN pk.eyJ1IjoiYW5kaXM3NzciLCJhIjoiY20zc2xxcTZnMGFlNTJuczJ1NWxudzNoaSJ9.kkh9khJt3BeNQeUTtRHPDw
VITE_YAMAPS_API_KEY 45bcab79-18b5-4671-9833-aabe60b80782
OPENWEATHER_API_KEY 9f62f2167df3b6748abb5e918e968ea8

15.13. Sentry (self-hosted)

Var Значение
SENTRY_DSN (Python services) https://e6b2a000bd24402d824ce2b13b6bc523@errors.arkhyz-club.ru/2
SENTRY_ENV stage (поменять на production после готовности)
SENTRY_TRACES_RATE 0.1
Collector UI https://errors.arkhyz-club.ru (basic-auth admin / Arkhyz_monitor_2026!)

15.14. Подключение к серверу

Что Как
SSH ssh -i ~/.ssh/arkhyz_prod root@arkhyz-club.ru
External IP 85.239.53.191
Repo на сервере /root/arkhyz-admin-main/
Логи всех сервисов journalctl -u arkhyz-auto-deploy -f / docker logs -f arkhyz-<svc>
Backup recordings /opt/arkhyz-backup/ + S3 besedka/

15.15. GitHub / CI

Что Где
Repo https://github.com/andis777/arkhyz-admin-main (private)
Self-hosted runner label arkhyz-prod (3 workflow: routes-drift, tests, ui-visual-regression)
Secrets (Settings → Secrets) SUPABASE_PROJECT_REF, SUPABASE_ACCESS_TOKEN, S3_*, LIVEKIT_*, и т.д.
GitHub Actions billing требует $1 spending limit (Settings → Billing) — иначе все cloud workflows блокируются

Последнее обновление: 2026-05-28. Если что-то устарело — grep -rn "old-domain-name" docs/PROJECT_ACCESS.md и PR.