{"id":21175539,"url":"https://github.com/capcom6-learning/otus-python-basic-project","last_synced_at":"2025-10-29T13:17:34.950Z","repository":{"id":114529540,"uuid":"523388962","full_name":"capcom6-learning/otus-python-basic-project","owner":"capcom6-learning","description":null,"archived":false,"fork":false,"pushed_at":"2024-12-17T06:43:11.000Z","size":66,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-21T11:28:13.817Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/capcom6-learning.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-08-10T15:03:44.000Z","updated_at":"2024-12-17T06:43:13.000Z","dependencies_parsed_at":"2024-06-19T05:59:30.577Z","dependency_job_id":null,"html_url":"https://github.com/capcom6-learning/otus-python-basic-project","commit_stats":null,"previous_names":["capcom6-learning/otus-python-basic-project"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/capcom6-learning%2Fotus-python-basic-project","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/capcom6-learning%2Fotus-python-basic-project/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/capcom6-learning%2Fotus-python-basic-project/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/capcom6-learning%2Fotus-python-basic-project/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/capcom6-learning","download_url":"https://codeload.github.com/capcom6-learning/otus-python-basic-project/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243624090,"owners_count":20321029,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-20T16:59:49.815Z","updated_at":"2025-10-29T13:17:29.900Z","avatar_url":"https://github.com/capcom6-learning.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Серверная часть погодного портала для метеостанций\n\nПриложение предназначено для сбора информации о текущей погоде с метеостанций и предоставления погодной информации клиентам.\n\n## Требования\n\n### Функциональные требования\n\n- получение данных с нескольких метеостанций;\n- получение данных в нескольких форматах;\n- работа как минимум с 3 измерениями: температура воздуха, скорость ветра, направление ветра;\n- предоставление информации о текущей погоде;\n- предоставление информации о погоде за период в виде графиков;\n- предоставление информации о прогнозе погоды (за счет внешних сервисов);\n- наличие веб-интерфейса пользователя с анонимным доступом;\n- наличие API для мобильных приложений;\n- наличие административного интерфейса для управления списком метеостанций.\n\n### Нефункциональные требования\n\n- хранение погодных данных не менее 5 лет;\n- возможность горизонтального масштабирования и шардирования хранилища.\n\n### Оценка нагрузки\n\n1. 1_000 метеостанций.\n2. Измерения каждые 5 секунд -\u003e 1_000 запросов на 5 секунд -\u003e 200 RPS.\n3. 100_000 пользователей в сутки.\n4. Среднее время сессии 5 минут.\n5. Автоматическое обновление страницы каждые 10 секунд -\u003e 30 запросов на пользователя -\u003e 3_000_000 запросов в сутки -\u003e 35 RPS.\n\nС учетом неравномерности нагрузки от пользователей - 200 RPS + 3 * 35 RPS = 305 RPS.\n\n### Оценка хранилища\n\n1. Одна запись - 512 байт.\n2. 17_280 измерений в сутки с каждой метеостанции -\u003e 17_280_000 записей в сутки с 1_000 метеостанций -\u003e 8 ГБ в сутки.\n3. Прогнозные данные: 1_000 метеостанций каждые 2 часа 1 запись -\u003e 6МБ в сутки.\n4. За 5 лет - 15 ТБ данных.\n5. + индексы.\n\n\n### Оценка кэша\n\n1. Кэширование сформированных графиков.\n2. Один график - 64 кб.\n3. 1_000 метеостанций x 3 графика x 64 кб -\u003e 188 МБ ОЗУ.\n\n### Оценка пропускной способности\n\n1. Получение данных с метеостанций: 200 RPS * 1_024 байта (данные + заголовки) = 200 кб/с.\n2. Предоставление данных пользователям: 3_000_000 запросов в сутки, 50% - текущая погода (1_024 байта), 30% - массив данных (100 кб), 20% - графики (192 кб) = 1,43 ГБ + 85,83 ГБ + 109,86 ГБ = 197,12 ГБ в сутки -\u003e 2_392 кб/с.\n\nС учетом неравномерности нагрузки - 10 МБ/с.\n\n## Минимальная реализация\n\nВ рамках MVP планируется реализовать:\n\n- [x] API администратора:\n    - [x] Basic авторизация;\n    - [x] добавление, редактирование и удаление метеостанций.\n- [x] получение данных от метеостанций в одном формате;\n- [x] сохранение данных в БД;\n- [x] API клиентов:\n    - [x] список метеостанций;\n    - [x] текущие погодные данные;\n    - [x] массив данных за период по выбранным измерениям;\n    - [x] графики изменения параметров.\n- [x] страница состояния метеостанций.\n\n### Технологии\n\nПланируется использовать следующее ПО, библиотеки и технологии:\n\n* Nginx, Gunicorn, Uvicorn, FastAPI - HTTP-доступ;\n* MongoDB, Motor - хранение данных и доступ к ним;\n* Matplotlib - построение графиков;\n* Jinja2 - шаблонизатор для страницы состояния.\n\n## Рабочие заметки\n\nСсылка запроса прогноза. Время отстает на ~ -17 часов.\n\nhttps://www.windguru.net/int/iapi.php?q=forecast\u0026id_model=3\u0026rundef=2022082018x0x240x0x240\u0026initstr=2022082018\u0026id_spot=233638\u0026WGCACHEABLE=21600\u0026cachefix=54.643x90.165x369","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcapcom6-learning%2Fotus-python-basic-project","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcapcom6-learning%2Fotus-python-basic-project","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcapcom6-learning%2Fotus-python-basic-project/lists"}