Добавлена команда ротации — решение владельца. Формы в админке нет.
python -m app.bootstrap --reset-admin-password
Команда применяет ADMIN_PASSWORD из настроек к существующему админу через user_service.set_password: пароль проходит обычную проверку, а token_version увеличивается, так что все выданные админские сессии перестают действовать. Отказ с понятной ошибкой, если пароль пуст, админа нет или ADMIN_BOOTSTRAP_ENABLED=false. Логин команда не меняет. Обычный старт (entrypoint.sh) пароль существующего админа по-прежнему не трогает.
Исправлены комментарии, отсылавшие к «смене через панель», которой нет: в bootstrap.py и в admin_service.set_player_password.
Процедура на Pi описана в deploy/pi/README.md, кратко — в README:
поменять ADMIN_PASSWORD в .env;
docker compose up -d — контейнер читает .env только при создании;
## Что сделано
Добавлена команда ротации — решение владельца. Формы в админке нет.
```
python -m app.bootstrap --reset-admin-password
```
Команда применяет `ADMIN_PASSWORD` из настроек к существующему админу через `user_service.set_password`: пароль проходит обычную проверку, а `token_version` увеличивается, так что все выданные админские сессии перестают действовать. Отказ с понятной ошибкой, если пароль пуст, админа нет или `ADMIN_BOOTSTRAP_ENABLED=false`. Логин команда не меняет. Обычный старт (`entrypoint.sh`) пароль существующего админа по-прежнему не трогает.
Исправлены комментарии, отсылавшие к «смене через панель», которой нет: в `bootstrap.py` и в `admin_service.set_player_password`.
Процедура на Pi описана в `deploy/pi/README.md`, кратко — в README:
1. поменять `ADMIN_PASSWORD` в `.env`;
2. `docker compose up -d` — контейнер читает `.env` только при создании;
3. `docker compose exec app python -m app.bootstrap --reset-admin-password`.
## Модель угрозы
- **Сценарий:** пароль админа утёк, или украдена админская cookie (живёт до 8 ч).
- **Было:** сменить пароль можно было только правкой БД руками; отозвать выданные сессии — никак.
- **Стало:**
- владелец одной командой ставит новый пароль;
- рост `token_version` отзывает все админские токены — `get_current_admin` сверяет `ver`.
- **Поверхность атаки не растёт:** веб-эндпойнта нет, команда требует доступа к серверу.
## Что проверено
- `pytest` — 213 passed. Новый `test_admin_password_reset.py`:
- после ротации применён новый пароль, `token_version` вырос на 1, прежняя админская cookie получает 401, вход по старому паролю — 401, по новому — 200;
- обычный bootstrap в prod пароль существующего админа не меняет;
- понятные отказы: нет админа, пустой пароль, bootstrap выключен.
На старом `bootstrap.py` три теста падают. Четвёртый — страховка прежнего поведения — проходит, как и должен.
- `python -m app.bootstrap --help` показывает флаг.
## Коммиты
- `0ee7cd1` Безопасность: команда ротации пароля администратора из .env
## Отклонения от плана
Нет.
Closes #73
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
В prod пароль админа задавался только при первом создании: обычный bootstrap
его из .env не берёт, панель не меняет — комментарии отсылали друг к другу.
Теперь `python -m app.bootstrap --reset-admin-password` применяет ADMIN_PASSWORD
к существующему админу через user_service.set_password: пароль проверяется,
token_version растёт, и все админские сессии (в том числе чужие) отзываются.
Обычный старт по-прежнему пароль не трогает.
Процедура на Pi — в deploy/pi/README.md (правка .env → docker compose up -d →
exec команды), кратко — в README. #73
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Что сделано
Добавлена команда ротации — решение владельца. Формы в админке нет.
Команда применяет
ADMIN_PASSWORDиз настроек к существующему админу черезuser_service.set_password: пароль проходит обычную проверку, аtoken_versionувеличивается, так что все выданные админские сессии перестают действовать. Отказ с понятной ошибкой, если пароль пуст, админа нет илиADMIN_BOOTSTRAP_ENABLED=false. Логин команда не меняет. Обычный старт (entrypoint.sh) пароль существующего админа по-прежнему не трогает.Исправлены комментарии, отсылавшие к «смене через панель», которой нет: в
bootstrap.pyи вadmin_service.set_player_password.Процедура на Pi описана в
deploy/pi/README.md, кратко — в README:ADMIN_PASSWORDв.env;docker compose up -d— контейнер читает.envтолько при создании;docker compose exec app python -m app.bootstrap --reset-admin-password.Модель угрозы
token_versionотзывает все админские токены —get_current_adminсверяетver.Что проверено
pytest— 213 passed. Новыйtest_admin_password_reset.py:token_versionвырос на 1, прежняя админская cookie получает 401, вход по старому паролю — 401, по новому — 200;На старом
bootstrap.pyтри теста падают. Четвёртый — страховка прежнего поведения — проходит, как и должен.python -m app.bootstrap --helpпоказывает флаг.Коммиты
0ee7cd1Безопасность: команда ротации пароля администратора из .envОтклонения от плана
Нет.
Closes #73
🤖 Generated with Claude Code
https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd