feat: учётки стенда заводятся при старте, пароль совпадает с логином

This commit is contained in:
gglamer 2026-09-29 12:18:17 +00:00
commit a3224cb63a
4 changed files with 10 additions and 11 deletions

View file

@ -90,10 +90,10 @@ local-stt: ## Запустить локальный whisper.cpp server на loca
backup: ## Резервная копия базы в backend/backups/ (для cron: раз в сутки) backup: ## Резервная копия базы в backend/backups/ (для cron: раз в сутки)
cd backend && $(UV) run python scripts/backup.py 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 cd backend && $(UV) run python scripts/users.py
users-docker: ## Завести учётные записи внутри локального контейнера (после make offline) users-docker: ## То же внутри контейнера; compose и так заводит их при старте backend
$(COMPOSE) exec backend python scripts/users.py $(COMPOSE) exec backend python scripts/users.py
seed: ## Залить сценарии из /scenarios в БД seed: ## Залить сценарии из /scenarios в БД

View file

@ -2,10 +2,11 @@
Без входа система не работает (lct-23), а заводить первого администратора Без входа система не работает (lct-23), а заводить первого администратора
руками в базе — плохой первый шаг для того, кто разворачивает стенд. руками в базе — плохой первый шаг для того, кто разворачивает стенд.
Скрипт создаёт по одной записи на роль и печатает пароли один раз. Скрипт создаёт по одной записи на роль; compose запускает его при каждом
старте backend, существующие записи он не трогает.
Пароли случайные: зашитый в репозиторий «admin/admin» переживёт сдачу Пароль совпадает с логином: стенд учебный, его поднимают на показе и в классе,
и уедет в реальный класс. и учётки должны быть известны заранее, без поиска строки в логе контейнера.
make users создать недостающие make users создать недостающие
make users force=1 пересоздать пароли существующих make users force=1 пересоздать пароли существующих
@ -13,7 +14,6 @@
import asyncio import asyncio
import os import os
import secrets
import sys import sys
from pathlib import Path from pathlib import Path
@ -45,7 +45,7 @@ async def main() -> int:
print(f" {login}: уже есть") print(f" {login}: уже есть")
continue continue
password = secrets.token_urlsafe(9) password = login
if user is None: if user is None:
user = User(login=login, full_name=full_name, role=role.value, service=service) user = User(login=login, full_name=full_name, role=role.value, service=service)
db.add(user) db.add(user)
@ -67,10 +67,9 @@ async def main() -> int:
print("все учётные записи на месте (пересоздать: make users force=1)") print("все учётные записи на месте (пересоздать: make users force=1)")
return 0 return 0
print("\nЗаписано. Пароли показываются один раз:\n") print("\nЗаписано, пароль совпадает с логином:\n")
for login, password in created: for login, password in created:
print(f" {login:10} {password}") print(f" {login:10} {password}")
print("\nСменить пароль можно только пересозданием: экран смены пароля — lct-24.")
return 0 return 0

View file

@ -44,7 +44,7 @@ services:
fi; fi;
export SESSION_SECRET="$$(cat /run/lct/session-secret)"; export SESSION_SECRET="$$(cat /run/lct/session-secret)";
fi; 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' uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 1'
environment: environment:
DATABASE_URL: postgresql+asyncpg://lct:${POSTGRES_PASSWORD:-lct}@postgres:5432/lct DATABASE_URL: postgresql+asyncpg://lct:${POSTGRES_PASSWORD:-lct}@postgres:5432/lct

View file

@ -67,7 +67,7 @@ FRONTEND=$!
say "Стенд поднят" say "Стенд поднят"
cat <<'LINKS' cat <<'LINKS'
вход: http://localhost:5173/ (пароли печатает make users) вход: http://localhost:5173/ (admin / teacher / trainee, пароль = логин)
пульт преподавателя: http://localhost:5173/instructor пульт преподавателя: http://localhost:5173/instructor
профили курсантов: http://localhost:5173/profile профили курсантов: http://localhost:5173/profile
ссылки на АРМ курсанта, монитор и ДДС печатает сам пульт ссылки на АРМ курсанта, монитор и ДДС печатает сам пульт