Пароль администратора в test/prod задаётся только один раз — при первом создании админа, — и дальше сменить его штатно нельзя:
app/bootstrap.py:39-42: если админ уже существует и окружение не development, пароль из .envне применяется. Комментарий: «пароль НЕ перезаписываем (мог быть изменён через панель)».
Но через панель пароль админа не меняется. admin_service.set_player_password (PUT /api/admin/users/{id}/password) явно отказывает для role != 'player', а в докстринге написано «Пароль админа так не меняется — он задаётся ADMIN_PASSWORD в .env».
Эндпойнта «сменить свой пароль» для админа нет: PUT /api/users/me/password требует сессию игрока (fs_session), у админа её нет.
Получается замкнутый круг: .env отсылает к панели, панель — к .env, и ни то ни другое не работает.
Чем грозит
Утёк или скомпрометирован пароль админа на проде — поменять его можно только правкой БД руками (sqlite3 в томе + bcrypt-хеш) или удалением админа с пересозданием через bootstrap.
Смена ADMIN_PASSWORD в .env на Pi молча ни на что не влияет: владелец уверен, что пароль сменён, а вход работает со старым. При этом _forbid_default_secrets_in_prod продолжает требовать от .env недефолтный пароль.
token_version админа тоже не увеличить, так что уже выданные админские сессии не отозвать (живут до 8 ч или до logout).
Варианты решения
Добавить админу смену собственного пароля в панели (с текущим паролем, throttle, инкрементом token_version); и/или
явную команду ротации, например python -m app.bootstrap --reset-admin-password / переменную ADMIN_PASSWORD_FORCE_RESET=1, чтобы применить пароль из .env на проде осознанно;
поправить комментарии в bootstrap.py и admin_service.py и описать процедуру в deploy/pi/README.md.
Найдено при сверке документации с кодом.
## Проблема
Пароль администратора в test/prod задаётся **только один раз** — при первом создании админа, — и дальше сменить его штатно нельзя:
- `app/bootstrap.py:39-42`: если админ уже существует и окружение не `development`, пароль из `.env` **не применяется**. Комментарий: «пароль НЕ перезаписываем (мог быть изменён через панель)».
- Но через панель пароль админа не меняется. `admin_service.set_player_password` (`PUT /api/admin/users/{id}/password`) явно отказывает для `role != 'player'`, а в докстринге написано «Пароль админа так не меняется — он задаётся ADMIN_PASSWORD в .env».
- Эндпойнта «сменить свой пароль» для админа нет: `PUT /api/users/me/password` требует сессию игрока (`fs_session`), у админа её нет.
Получается замкнутый круг: `.env` отсылает к панели, панель — к `.env`, и ни то ни другое не работает.
## Чем грозит
- Утёк или скомпрометирован пароль админа на проде — поменять его можно только правкой БД руками (`sqlite3` в томе + bcrypt-хеш) или удалением админа с пересозданием через bootstrap.
- Смена `ADMIN_PASSWORD` в `.env` на Pi молча ни на что не влияет: владелец уверен, что пароль сменён, а вход работает со старым. При этом `_forbid_default_secrets_in_prod` продолжает требовать от `.env` недефолтный пароль.
- `token_version` админа тоже не увеличить, так что уже выданные админские сессии не отозвать (живут до 8 ч или до logout).
## Варианты решения
- Добавить админу смену собственного пароля в панели (с текущим паролем, throttle, инкрементом `token_version`); **и/или**
- явную команду ротации, например `python -m app.bootstrap --reset-admin-password` / переменную `ADMIN_PASSWORD_FORCE_RESET=1`, чтобы применить пароль из `.env` на проде осознанно;
- поправить комментарии в `bootstrap.py` и `admin_service.py` и описать процедуру в `deploy/pi/README.md`.
Найдено при сверке документации с кодом.
Решение владельца — явная команда ротации из .env, без формы в админке.
python -m app.bootstrap --reset-admin-password: берёт ADMIN_PASSWORD из настроек и записывает его существующему админу через user_service.set_password (проверка пароля + token_version++ → все админские сессии отзываются). Понятный отказ, если пароль пуст, админа нет или bootstrap выключен. Обычный запуск из entrypoint.sh не меняется.
Исправить комментарии в bootstrap.py и admin_service.set_player_password: никакой «смены через панель».
Процедура в deploy/pi/README.md и README.md: правка .env → docker compose up -d (пересоздать app, иначе он не увидит новый .env) → docker compose exec app python -m app.bootstrap --reset-admin-password.
Тесты: новый пароль применён; старая админская cookie → 401; обычный bootstrap в prod пароль не трогает; ошибки при пустом пароле или без админа.
Критерии готовности
Команда меняет пароль и отзывает админские сессии; обычный bootstrap в prod пароль не трогает.
Процедура описана в документации; pytest зелёный, новые тесты на старом коде падают.
Ветка:issue-73-admin-password от dev
## План выполнения
Решение владельца — **явная команда ротации из `.env`**, без формы в админке.
1. `python -m app.bootstrap --reset-admin-password`: берёт `ADMIN_PASSWORD` из настроек и записывает его существующему админу через `user_service.set_password` (проверка пароля + `token_version++` → все админские сессии отзываются). Понятный отказ, если пароль пуст, админа нет или bootstrap выключен. Обычный запуск из `entrypoint.sh` не меняется.
2. Исправить комментарии в `bootstrap.py` и `admin_service.set_player_password`: никакой «смены через панель».
3. Процедура в `deploy/pi/README.md` и `README.md`: правка `.env` → `docker compose up -d` (пересоздать `app`, иначе он не увидит новый `.env`) → `docker compose exec app python -m app.bootstrap --reset-admin-password`.
4. Тесты: новый пароль применён; старая админская cookie → 401; обычный bootstrap в prod пароль не трогает; ошибки при пустом пароле или без админа.
**Критерии готовности**
- Команда меняет пароль и отзывает админские сессии; обычный bootstrap в prod пароль не трогает.
- Процедура описана в документации; `pytest` зелёный, новые тесты на старом коде падают.
**Ветка:** `issue-73-admin-password` от `dev`
Итог:python -m app.bootstrap --reset-admin-password применяет ADMIN_PASSWORD из .env к существующему админу и отзывает все его сессии (token_version++). Процедура на Pi — в deploy/pi/README.md: правка .env → docker compose up -d → docker compose exec app python -m app.bootstrap --reset-admin-password. Проверки:pytest — 213 passed; новые тесты на старом коде падают. Статус:Status/In Review Осталось за вами: ревью и мёрж PR — задача закроется автоматически.
Работа выполнена, открыт PR: https://gitea.arseniev.info/NotBigGhost/ForbiddenStarsApp/pulls/95
**Итог:** `python -m app.bootstrap --reset-admin-password` применяет `ADMIN_PASSWORD` из `.env` к существующему админу и отзывает все его сессии (`token_version++`). Процедура на Pi — в `deploy/pi/README.md`: правка `.env` → `docker compose up -d` → `docker compose exec app python -m app.bootstrap --reset-admin-password`.
**Проверки:** `pytest` — 213 passed; новые тесты на старом коде падают.
**Статус:** `Status/In Review`
**Осталось за вами:** ревью и мёрж PR — задача закроется автоматически.
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.
Проблема
Пароль администратора в test/prod задаётся только один раз — при первом создании админа, — и дальше сменить его штатно нельзя:
app/bootstrap.py:39-42: если админ уже существует и окружение неdevelopment, пароль из.envне применяется. Комментарий: «пароль НЕ перезаписываем (мог быть изменён через панель)».admin_service.set_player_password(PUT /api/admin/users/{id}/password) явно отказывает дляrole != 'player', а в докстринге написано «Пароль админа так не меняется — он задаётся ADMIN_PASSWORD в .env».PUT /api/users/me/passwordтребует сессию игрока (fs_session), у админа её нет.Получается замкнутый круг:
.envотсылает к панели, панель — к.env, и ни то ни другое не работает.Чем грозит
sqlite3в томе + bcrypt-хеш) или удалением админа с пересозданием через bootstrap.ADMIN_PASSWORDв.envна Pi молча ни на что не влияет: владелец уверен, что пароль сменён, а вход работает со старым. При этом_forbid_default_secrets_in_prodпродолжает требовать от.envнедефолтный пароль.token_versionадмина тоже не увеличить, так что уже выданные админские сессии не отозвать (живут до 8 ч или до logout).Варианты решения
token_version); и/илиpython -m app.bootstrap --reset-admin-password/ переменнуюADMIN_PASSWORD_FORCE_RESET=1, чтобы применить пароль из.envна проде осознанно;bootstrap.pyиadmin_service.pyи описать процедуру вdeploy/pi/README.md.Найдено при сверке документации с кодом.
План выполнения
Решение владельца — явная команда ротации из
.env, без формы в админке.python -m app.bootstrap --reset-admin-password: берётADMIN_PASSWORDиз настроек и записывает его существующему админу черезuser_service.set_password(проверка пароля +token_version++→ все админские сессии отзываются). Понятный отказ, если пароль пуст, админа нет или bootstrap выключен. Обычный запуск изentrypoint.shне меняется.bootstrap.pyиadmin_service.set_player_password: никакой «смены через панель».deploy/pi/README.mdиREADME.md: правка.env→docker compose up -d(пересоздатьapp, иначе он не увидит новый.env) →docker compose exec app python -m app.bootstrap --reset-admin-password.Критерии готовности
pytestзелёный, новые тесты на старом коде падают.Ветка:
issue-73-admin-passwordотdevРабота выполнена, открыт PR: #95
Итог:
python -m app.bootstrap --reset-admin-passwordприменяетADMIN_PASSWORDиз.envк существующему админу и отзывает все его сессии (token_version++). Процедура на Pi — вdeploy/pi/README.md: правка.env→docker compose up -d→docker compose exec app python -m app.bootstrap --reset-admin-password.Проверки:
pytest— 213 passed; новые тесты на старом коде падают.Статус:
Status/In ReviewОсталось за вами: ревью и мёрж PR — задача закроется автоматически.