4.0 KiB
4.0 KiB
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 ~/lang/deploy_lang.sh
Что делает скрипт:
- Читает Groq API ключ из
~/lang/token.txt - Вшивает ключ в
index.htmlчерезsed(в HTML ключ всегда пустая строка) - rsync всей папки на ВМ (
5.172.178.213) kubectl applyconfigmap + deployment + ingresskubectl 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 доступ
# ВМ (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