feat: CI/CD pipeline + Learning/Medicine/Travel services
Some checks failed
Build and Deploy GooSeek / build-backend (push) Failing after 1m4s
Build and Deploy GooSeek / build-webui (push) Failing after 1m2s
Build and Deploy GooSeek / deploy (push) Has been skipped

- Add Gitea Actions workflow for automated build & deploy
- Add K8s manifests: webui, travel-svc, medicine-svc, sandbox-svc
- Update kustomization for localhost:5000 registry
- Add ingress for gooseek.ru and api.gooseek.ru
- Learning cabinet with onboarding, courses, sandbox integration
- Medicine service with symptom analysis and doctor matching
- Travel service with itinerary planning
- Server setup scripts (NVIDIA/CUDA, K3s, Gitea runner)

Made-with: Cursor
This commit is contained in:
home
2026-03-02 20:25:44 +03:00
parent 08bd41e75c
commit ab48a0632b
92 changed files with 15562 additions and 2198 deletions

View File

@@ -1,87 +1,39 @@
# Недоделки — начать отсюда
## Последнее изменение (01.03.2026)
## CI/CD готов — осталось создать репозиторий в Gitea
### СДЕЛАНО: Маршруты по дорогам + стоимость проезда
### Сделано (CI/CD подготовка репозитория)
- [x] Обновлён `.gitignore`: игнорируются секреты, временные файлы, кэши
- [x] Обновлён `.dockerignore`: оптимизирован для сборки образов
- [x] Созданы K8s манифесты:
- `backend/deploy/k8s/webui.yaml` — новый
- `backend/deploy/k8s/travel-svc.yaml` — новый
- [x] Обновлён `backend/deploy/k8s/kustomization.yaml`:
- images используют `localhost:5000/gooseek/*`
- добавлены webui.yaml и travel-svc.yaml
- [x] Обновлён `backend/deploy/k8s/ingress.yaml`:
- gooseek.ru → webui:3000
- api.gooseek.ru → api-gateway:3015
- [x] Обновлён `backend/deploy/k8s/deploy.sh`:
- push в localhost:5000 registry
- rolling restart всех сервисов
- [x] Создан `.gitea/workflows/deploy.yaml`:
- CI/CD workflow для Gitea Actions
- Сборка backend + webui
- Автодеплой в K8s
#### Что сделано:
### Осталось сделать
1. [ ] Создать репозиторий `gooseek` в Gitea (https://git.gooseek.ru)
2. [ ] Пуш кода: `git remote add gitea https://git.gooseek.ru/admin/gooseek.git && git push -u gitea main`
3. [ ] Проверить что CI/CD workflow запустился и задеплоился
**1. `backend/internal/travel/twogis.go` — 2GIS Routing API клиент:**
- Метод `GetRoute(ctx, points, transport)` — POST `routing.api.2gis.com/routing/7.0.0/global`
- Поддержка transport: `driving`, `taxi`, `walking`, `bicycle`
- Парсинг WKT LINESTRING из `outcoming_path.geometry[].selection`
- Сборка `RouteDirection` с geometry, distance, duration, steps
### Ранее сделано
- Learning кабинет полностью готов
- Medicine сервис полностью готов
- Все K8s манифесты для всех сервисов
**2. `backend/internal/travel/service.go` — переключение на 2GIS:**
- `GetRoute()` сначала пробует 2GIS Routing, fallback на OpenRouteService
- `mapProfileToTwoGISTransport()` — маппинг профилей
**3. `backend/internal/agent/travel_data_client.go` — обновлённый клиент:**
- `GetRoute(ctx, points, transport)` — полный `RouteDirectionResult` с geometry
- `GetRouteSegments()` — маршруты между каждой парой точек
- Новые типы: `RouteDirectionResult`, `RouteGeometryResult`, `RouteStepResult`, `RouteSegmentResult`
**4. `backend/internal/agent/travel_orchestrator.go` — дорожные маршруты:**
- `emitTravelWidgets()` вызывает `buildRoadRoute()` вместо прямых линий
- `buildTransportSegments()` — маршруты между каждой парой точек
- `calculateTransportCosts()` — расчёт стоимости (машина ~8₽/км, автобус ~2.5₽/км, такси ~100₽+18₽/км)
- `routeDirection` и `segments` передаются в виджеты `travel_map` и `travel_itinerary`
**5. Фронтенд — отображение дорожных маршрутов:**
- `types.ts` — новые типы `RouteSegment`, `TransportCostOption`, расширены `TravelMapWidgetParams` и `TravelItineraryWidgetParams`
- `useTravelChat.ts` — извлечение `routeDirection` и `segments` из виджетов, новые state
- `travel/page.tsx` — передача `routeDirection` в `TravelMap`
- `TravelWidgets.tsx``TransportSegmentCard` между элементами маршрута с иконками машина/автобус/такси и ценами
---
### СДЕЛАНО ранее: Переработка POI коллектора — 2GIS как основной источник
(см. предыдущую версию CONTINUE.md)
---
## Осталось сделать
### Высокий приоритет
1. **Цены отелей из SearXNG** — LLM не всегда извлекает цены (0 RUB/night). Нужно:
- Добавить fallback: если цена 0, попробовать парсить из snippet
- Файл: `backend/internal/agent/travel_hotels_collector.go`
2. **Авиабилеты для маршрутов** — "Золотое кольцо" не имеет IATA кода. Нужно:
- Если destination не IATA, искать билеты до первого конкретного города в маршруте
- Файл: `backend/internal/agent/travel_flights_collector.go`
### Средний приоритет
3. **Drag & drop в ItineraryWidget** — перетаскивание элементов между днями
4. **Кеш SearXNG результатов** — Redis кеш на 10-30 минут
5. **Сохранение draft в БД** — персистентность TripDraft через trip_drafts таблицу
### Низкий приоритет
6. **Экспорт маршрута** — PDF/Markdown
7. **Real-time обновления** — WebSocket для тредов
---
## Контекст
### Архитектура travel pipeline:
```
User -> /travel page -> streamTravelAgent() -> api-gateway -> chat-svc -> agent-svc
-> RunTravelOrchestrator:
1. Planner Agent (LLM) -> TripBrief
2. Geocode destinations -> travel-svc -> 2GIS Geocoder API
3. Parallel collectors:
- Events: SearXNG -> Crawl4AI -> LLM extraction -> geocode (2GIS)
- POI: 2GIS Places API (primary) -> LLM enrichment -> SearXNG fallback
- Hotels: SearXNG -> Crawl4AI -> LLM extraction -> geocode (2GIS)
- Transport: TravelPayouts API
4. Itinerary Builder (LLM) -> ItineraryDay[]
5. Road routing: 2GIS Routing API -> RouteDirection (дорожная геометрия)
6. Transport costs: calculateTransportCosts() -> машина/автобус/такси
7. Widget emission -> NDJSON stream -> frontend (карта 2GIS MapGL)
```
### Контекст для продолжения
- Сервер: 192.168.31.59 (внутренний IP), 5.187.77.89 (внешний)
- Gitea: https://git.gooseek.ru
- Registry: localhost:5000 (внутренний, без внешнего доступа)
- K3s + Nginx Ingress + Cert-Manager уже установлены