Исправлен деплой скрипт

This commit is contained in:
2026-10-07 16:20:42 +03:00
parent d897601d88
commit cc194b8eee
7 changed files with 201 additions and 19 deletions

View File

@@ -24,7 +24,7 @@ make run # создаст .venv, поставит зависим
Яндекс.Диск (xlsx)
│ скачивание по публичной ссылке
▼
api (FastAPI), порт 8000, наружу — только 127.0.0.1 (в docker так публикуется порт)
api (FastAPI), порт 8000, в docker публикуется на 127.0.0.1
• скачивает и разбирает xlsx без сторонних библиотек
• кэш в памяти: TTL + проверка даты изменения файла + stale-while-error
• один воркер, поэтому кэш общий
@@ -128,7 +128,8 @@ src/
tools/
make_icons.py генерация иконок приложения из логотипа (нужен rsvg-convert)
deploy/
nginx-dev.conf пример сайта nginx для отдельного стенда
nginx-site.sh генерация и включение конфига nginx (SSL — сертификат родителя)
nginx-dev.conf конфиг-заготовка для стенда без wildcard у родителя
README-dev.md как поднять второй стенд рядом с основным
tests/
conftest.py общие фикстуры
@@ -176,8 +177,8 @@ tests/
| `SCHEDULE_RETRY_AFTER` | `60` | api | пауза между попытками при сбое источника |
| `SCHEDULE_API` | `http://127.0.0.1:8000` | frontend | адрес бэкенда (в docker: `http://api:8000`) |
| `SCHEDULE_PROXY_TIMEOUT` | `150` | frontend | таймаут прокси к бэкенду, сек |
| `API_PORT` | `8000` | docker | внешний порт api |
| `FRONTEND_PORT` | `8080` | docker | внешний порт frontend (на проде: `127.0.0.1:8090`) |
| `API_PORT` | `8000` | docker | внешний порт api (публикуется на 127.0.0.1) |
| `FRONTEND_PORT` | `8080` | docker | внешний порт frontend (публикуется на 127.0.0.1) |
`.env` ищется вверх от каталога модуля: и backend, и frontend находят общий
`.env` в корне репозитория; `load_dotenv` не перезаписывает уже выставленные
@@ -219,12 +220,35 @@ tests/
пакет venv: `sudo apt install python3-venv` (для нестандартной версии —
например, `python3.12-venv`).
- `httpx2` и `httpcore2` — новые пакеты (август 2026, httpx перешёл под
опеку Pydantic и был переименован). Если pip берёт пакеты из корпоративного
зеркала или старого индекса, этих пакетов там может ещё не быть; проверьте
установку напрямую: `pip install -r requirements-dev.txt -i https://pypi.org/simple`.
В коде и тестах модуль импортируется как `httpx2`; `import httpx` больше
не работает. В рабочем коде httpx2 не используется — нужен только тестам.
- Makefile написан под bash: Linux, macOS или WSL. На Windows без WSL
опеку Pydantic и был переименован). В коде и тестах модуль импортируется
как `httpx2`; `import httpx` больше не работает. В рабочем коде httpx2
не используется — нужен только тестам.
**Если pip не находит пакеты: зеркала**
Если pip настроен на корпоративное/национальное зеркало, оно может отставать
от PyPI — свежие пакеты на нём ещё не появились. Диагностика и обход:
```bash
pip index versions httpx2 # есть ли пакет на текущем индексе
pip install -r requirements-dev.txt -i <зеркало> # разово через другое зеркало
pip config set global.index-url <зеркало> # закрепить зеркало навсегда
```
Зеркала, проверенные 07.10.2026 (пакеты `httpx2`/`httpcore2` на месте;
URL подставлять как есть в `-i` / `index-url`):
| Зеркало | URL |
|---|---|
| PyPI, официальный | `https://pypi.org/simple` |
| TUNA (Tsinghua) | `https://pypi.tuna.tsinghua.edu.cn/simple` |
| Huawei Cloud | `https://mirrors.huaweicloud.com/repository/pypi/simple` |
| BFSU | `https://mirrors.bfsu.edu.cn/pypi/web/simple` |
| SJTU | `https://mirror.sjtu.edu.cn/pypi/web/simple` |
| USTC | `https://mirrors.ustc.edu.cn/pypi/simple` |
| SUSTech | `https://mirrors.sustech.edu.cn/pypi/simple` |
Makefile написан под bash: Linux, macOS или WSL. На Windows без WSL
используйте Docker-вариант из раздела «В Docker».
## Запуск
@@ -243,6 +267,8 @@ make run # = make venv + запуск api и сайта
- API — <http://127.0.0.1:8000> (например, `/status` и `/groups`);
- сайт — <http://127.0.0.1:8080> (его и открывать в браузере).
Чтобы отвязать процесс от терминала, стоит запускать через `nohup make run &`
Остановить — `Ctrl+C`. Данные скачиваются сразу на старте приложения
(скачивание занимает несколько секунд) и дальше обновляются по интервалу.
@@ -274,6 +300,24 @@ cp .env.example .env # вписать SCHEDULE_LINK (и порты при
У обоих сервисов есть healthcheck на `/healthz`; frontend стартует после того,
как api стал healthy. Обновление: `git pull && docker compose up -d --build`.
### Настройка nginx (прод)
Скрипт генерирует и включает конфиг сайта: http → https, прокси на
`FRONTEND_PORT` из `.env`, после проверки `nginx -t` перечитывает nginx.
SSL обеспечивается сертификатом родительского домена (обычно wildcard
`*.our-place.ru`) — отдельный certbot для поддомена не нужен.
```bash
sudo ls /etc/letsencrypt/live/ # имя сертификата родительского домена
sudo make nginx-install # или: sudo deploy/nginx-site.sh
```
Параметры: `--domain sched.example.ru`, `--cert example.ru` (по умолчанию —
родительский домен от `--domain`), `--port 8090` (по умолчанию —
`FRONTEND_PORT` из `.env`). Посмотреть конфиг, ничего не меняя:
`make nginx-print`. Если wildcard у родителя нет — выпустите сертификат
скриптом certbot, как для dev-стенда (см. `deploy/README-dev.md`).
### Тесты
```bash