diff --git a/Makefile b/Makefile index 86bcc9a..312f6e9 100644 --- a/Makefile +++ b/Makefile @@ -90,10 +90,10 @@ local-stt: ## Запустить локальный whisper.cpp server на loca backup: ## Резервная копия базы в backend/backups/ (для cron: раз в сутки) cd backend && $(UV) run python scripts/backup.py -users: ## Завести учётные записи ролей и напечатать пароли: make users force=1 +users: ## Завести учётные записи ролей, пароль = логин: make users force=1 — сбросить cd backend && $(UV) run python scripts/users.py -users-docker: ## Завести учётные записи внутри локального контейнера (после make offline) +users-docker: ## То же внутри контейнера; compose и так заводит их при старте backend $(COMPOSE) exec backend python scripts/users.py seed: ## Залить сценарии из /scenarios в БД diff --git a/backend/scripts/users.py b/backend/scripts/users.py index f255b37..d5094a0 100644 --- a/backend/scripts/users.py +++ b/backend/scripts/users.py @@ -2,10 +2,11 @@ Без входа система не работает (lct-23), а заводить первого администратора руками в базе — плохой первый шаг для того, кто разворачивает стенд. -Скрипт создаёт по одной записи на роль и печатает пароли один раз. +Скрипт создаёт по одной записи на роль; compose запускает его при каждом +старте backend, существующие записи он не трогает. -Пароли случайные: зашитый в репозиторий «admin/admin» переживёт сдачу -и уедет в реальный класс. +Пароль совпадает с логином: стенд учебный, его поднимают на показе и в классе, +и учётки должны быть известны заранее, без поиска строки в логе контейнера. make users создать недостающие make users force=1 пересоздать пароли существующих @@ -13,7 +14,6 @@ import asyncio import os -import secrets import sys from pathlib import Path @@ -45,7 +45,7 @@ async def main() -> int: print(f" {login}: уже есть") continue - password = secrets.token_urlsafe(9) + password = login if user is None: user = User(login=login, full_name=full_name, role=role.value, service=service) db.add(user) @@ -67,10 +67,9 @@ async def main() -> int: print("все учётные записи на месте (пересоздать: make users force=1)") return 0 - print("\nЗаписано. Пароли показываются один раз:\n") + print("\nЗаписано, пароль совпадает с логином:\n") for login, password in created: print(f" {login:10} {password}") - print("\nСменить пароль можно только пересозданием: экран смены пароля — lct-24.") return 0 diff --git a/docker-compose.yml b/docker-compose.yml index 1117ba2..2125be8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -44,7 +44,7 @@ services: fi; export SESSION_SECRET="$$(cat /run/lct/session-secret)"; fi; - alembic upgrade head && python scripts/seed.py && + alembic upgrade head && python scripts/seed.py && python scripts/users.py && uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 1' environment: DATABASE_URL: postgresql+asyncpg://lct:${POSTGRES_PASSWORD:-lct}@postgres:5432/lct diff --git a/scripts/demo.sh b/scripts/demo.sh index 77b2b6b..dc5fb76 100755 --- a/scripts/demo.sh +++ b/scripts/demo.sh @@ -67,7 +67,7 @@ FRONTEND=$! say "Стенд поднят" cat <<'LINKS' - вход: http://localhost:5173/ (пароли печатает make users) + вход: http://localhost:5173/ (admin / teacher / trainee, пароль = логин) пульт преподавателя: http://localhost:5173/instructor профили курсантов: http://localhost:5173/profile ссылки на АРМ курсанта, монитор и ДДС печатает сам пульт