Архитектура
Общая схема
TerrAI состоит из трех основных частей:
- frontend, который отдается через
nginx; - backend API на
FastAPI; PostgreSQL/PostGISдля пользователей и слоев.
Поток запросов:
- Браузер открывает frontend.
nginxобслуживает статические файлы интерфейса.- Все запросы
/api/*проксируются во backend. - Backend обращается к PostgreSQL, OpenRouter и геосервисам OpenStreetMap.
- Документация проекта
/docs/тоже отдается через тот же frontendnginx.
Frontend
Frontend расположен в каталоге frontend/.
Что делает frontend
- показывает карту;
- отправляет сообщения в чат;
- отправляет скриншоты карты и GeoJSON во backend;
- запускает генерацию PDF;
- управляет авторизацией пользователя;
- отображает и настраивает пользовательские слои.
Технологии и библиотеки frontend
HTML5CSS3Vanilla JavaScriptсES modulesLeafletдля картыhtml2canvasдля захвата карты в изображенияgeoraster-layer-for-leafletдля отображения GeoTIFF/растраgeotiff.jsдля работы с GeoTIFF в браузереnginxкак web server и reverse proxy для frontendMkDocsс темойreadthedocsдля документации/docs/
Основные frontend-модули
frontend/main.js— инициализация приложенияfrontend/modules/map.js— карта, базовые слои, координатная панельfrontend/modules/chat.js— чат и отправка запросовfrontend/modules/ui.js— боковые панели, PDF, welcome modalfrontend/modules/auth.js— авторизацияfrontend/modules/layers.js— работа с пользовательскими слоямиfrontend/modules/capture.js— создание скриншотов карты
Backend
Backend расположен в backend/terrai_backend/.
Что делает backend
- принимает chat-запросы;
- генерирует PDF-отчеты;
- обрабатывает auth и user sessions;
- сохраняет и выдает GeoJSON-слои;
- держит контекст чата только в памяти текущей browser/backend-сессии;
- собирает геоконтекст по координатам и объектам OSM;
- отправляет запросы к модели через OpenRouter.
Технологии и библиотеки backend
Python 3.12FastAPI— HTTP APIUvicorn— ASGI serverPydantic— типы и валидацияpython-multipart— приемmultipart/form-datapsycopg— подключение к PostgreSQLpsycopg-pool— connection poolrequests— HTTP-запросы к OpenRouter и геосервисамReportLab— генерация PDFpython-dotenv— загрузка переменных окружения
Внешние сервисы backend
OpenRouter— LLM для чата и PDFOpenStreetMap Nominatim— reverse/forward geocodingOpenStreetMap Overpass— nearby OSM contextPhoton— дополнительный геокодинг, где он еще используется в коде
Основные backend-модули
server.py— создание FastAPI app и подключение роутеровchat_pdf_routes.py—/api/chat,/api/pdf,/api/user/{user_id}auth_routes.py—/api/auth/*geojson_routes.py—/api/layers,/api/geojsonopenrouter.py— prompt-building и обращения к OpenRouterpdf_report.py— построение PDF-отчетаgeodata.py— reverse geocoding и OSM contextdb.py— PostgreSQL pool и SQL helpersstate.py— usage-limit и in-memory session stateapi_utils.py— общие helpers для request parsing и DB readiness
База данных
Используется PostgreSQL с образом PostGIS.
Что хранится в БД
usersauth_sessionsgeojson_documents
Зачем нужен PostGIS
Сейчас в проекте база используется в первую очередь как PostgreSQL-хранилище, но сервис поднимается на PostGIS, чтобы spatial-функции были доступны для дальнейшего развития.
Docker и инфраструктура
Сервисы
frontend— статический интерфейс и/docs/backend— FastAPI APIpostgis— база данных
Инфраструктурные технологии
Dockerdocker composenginxCoolifyTraefikчерез labels в compose
Документация и API
- проектная документация:
/docs/ - Swagger UI backend:
/api/docs - ReDoc backend:
/api/redoc - OpenAPI schema:
/api/openapi.json