Files
lang/doc/ARCHITECTURE.md
T

104 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Lyngvo — архитектура и инфраструктура
## Что это
Одностраничное веб-приложение (SPA) для тренировки итальянского произношения.
URL: `https://capire.kube5s.ru`
---
## Стек
| Компонент | Технология |
|---|---|
| Frontend | Single HTML file (`index.html`), vanilla JS, Web Audio API |
| Хостинг | Kubernetes (kube5s), namespace `default`, deploy `lyngvo` |
| Конфиг | ConfigMap `lyngvo-html` (index.html) + `lyngvo-nginx` (nginx.conf) |
| Ingress | `capire.kube5s.ru` |
| AI: распознавание речи | Groq Whisper (`whisper-large-v3`) |
| AI: перевод | Groq LLaMA (`llama-3.3-70b-versatile`) |
| TTS | Groq TTS (через тот же прокси) |
---
## Groq API прокси
Groq API заблокирован в России. Все запросы идут через немецкий сервер.
```
Браузер (Россия)
→ HTTPS → proxy.kube5s.ru (Германия, 95.179.252.111)
nginx (TLS termination, port 443)
→ localhost:8765 (Python HTTP сервер)
→ HTTPS → api.groq.com
```
### Компоненты на немецком сервере
| Файл/сервис | Назначение |
|---|---|
| `/opt/groq-proxy/proxy.py` | Python HTTP сервер, универсальный форвардер |
| `groq-proxy.service` (systemd) | Автозапуск proxy.py |
| `/etc/nginx/conf.d/groq-proxy.conf` | TLS + проброс на localhost:8765 |
| Let's Encrypt cert | `proxy.kube5s.ru` |
**Почему Python, а не nginx proxy_pass:**
nginx не может надёжно проксировать большие multipart/form-data (аудио) в Groq/Cloudflare — соединение обрывается с 408/502. Python `requests` делает нормальный HTTP-запрос от имени сервера.
---
## Деплой
```bash
bash ~/lang/deploy_lang.sh
```
Что делает скрипт:
1. Читает Groq API ключ из `~/lang/token.txt`
2. Вшивает ключ в `index.html` через `sed` (в HTML ключ всегда пустая строка)
3. rsync всей папки на ВМ (`5.172.178.213`)
4. `kubectl apply` configmap + deployment + ingress
5. `kubectl rollout restart deploy/lyngvo`
**Groq ключ** хранится только в `~/lang/token.txt``.gitignore`), в репо не коммитится.
---
## Файлы репо
```
index.html — вся логика приложения (один файл)
deploy_lang.sh — скрипт деплоя
nginx.conf — конфиг nginx внутри k8s пода
k8s/
deployment.yaml — Deployment + Service
ingress.yaml — Ingress capire.kube5s.ru
token.txt — Groq API ключ (в .gitignore)
doc/
ARCHITECTURE.md — этот файл
```
---
## Что живёт внутри index.html
- `VERSION` — строка версии, отображается в заголовке
- **phoneticAnalysis(blob)** — фонетический анализ аудио через Web Audio API (pitch, стабильность, артикуляция, качество окончания)
- **transcribe(blob)** — отправка аудио в Groq Whisper, возвращает распознанный текст
- **translateToRussian(text)** — перевод через Groq LLaMA
- **doCompare(blob, text, duration)** — параллельный запуск transcribe + phoneticAnalysis, формирует результат
- **История записей** — IndexedDB (`lyngvo_recs`), кнопки ▶ / 🎧 / 📊 / 🗑
- **История фраз** — localStorage, последние 5 фраз
---
## SSH доступ
```bash
# ВМ (Kubernetes)
ssh -i ~/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no naeel@5.172.178.213
# Немецкий сервер (Groq прокси)
ssh -i ~/.ssh/vultr_openssh -o StrictHostKeyChecking=no root@95.179.252.111
```