-[feedback_install_from_package_not_pip.md](feedback_install_from_package_not_pip.md) — на проде ставить из системных пакетов, НЕ pip-в-venv; не упаковано → упаковать, pip-venv только как обозначенный stopgap
-[feedback_build_requests_via_kanban.md](feedback_build_requests_via_kanban.md) — запросы на сборку/упаковку пакетов → Kanban (категория git-alt), НЕ GitLab issue в alt-packaging-agents
-[feedback_password_request_only.md](feedback_password_request_only.md) — пароли ТОЛЬКО через lavtomate password_request (одобрение в web UI); не читать автономно, не грепать секреты, не хранить plaintext для Claude
-[feedback_shared_passwords_rooter_store.md](feedback_shared_passwords_rooter_store.md) — пароль, нужный нескольким админам → класть в rooter password store, не в credentials.md и не plaintext в memory
-[reference_rooter_password_store.md](reference_rooter_password_store.md) — admin password store на server: чтение `ssh rooter@server pass show <name>` (gated rooter SSH), add/rm через root@server `/usr/local/sbin/admin-pass-add.sh`; `/var/lib/admin-pass/`
-[reference_remote_ssh_access.md](reference_remote_ssh_access.md) — Доступ к удалённым хостам через reverse-SSH на anyssh.ru: parentglobal=:10337/etersoft, rpi=:10338/root и др.
-[lesson_anyssh_ru_in_91232225.md](lesson_anyssh_ru_in_91232225.md) — anyssh.ru = 91.232.225.8, не маршрутизировать всю /24 через туннель
-[lesson_lavtomate_bug_create_confirmation.md](lesson_lavtomate_bug_create_confirmation.md) — bug_create теперь переиспользует approved confirmation_id при field-validation reject; можно ретраить с дополненными полями
...
...
@@ -125,6 +127,7 @@
-[lesson_roundcube_password_plugin_config.md](lesson_roundcube_password_plugin_config.md) — Roundcube password: `%c`→`%P` после 1.2, иначе DB Error 1064; не путать `password` и `password.log`
-[lesson_mail_postfix_sasl_config_path.md](lesson_mail_postfix_sasl_config_path.md) — mail.etersoft.ru: Postfix читает `/etc/postfix/sasl/smtpd.conf`, НЕ `/etc/sasl2/smtpd.conf`. Cyrus `imap=1`, Postfix `smtpauth=1`
-[lesson_mail_cert_renewal_webroot_hook.md](lesson_mail_cert_renewal_webroot_hook.md) — mail.etersoft.ru Let's Encrypt: renewal через cron.weekly (webroot, nginx должен быть UP), deploy-hook в `/etc/letsencrypt/renewal-hooks/deploy/` (НЕ `--renew-hook`) раскладывает cert в Postfix/Cyrus; инцидент 2026-07-04 — 2 причины протухания
-[lesson_rooter_home_pbs_restore.md](lesson_rooter_home_pbs_restore.md) — rooter@server доступ сломался удалением `/home/rooter` с aspetos (NFS); восстановление из PBS через `backup/restore-home.sh` (snapshot 2025-12-28); «shared-аккаунт не пускает» → проверять home на NFS-сервере
-[lesson_sieve_domain_split.md](lesson_sieve_domain_split.md) — sieve расщепление при symlink доменов: managesieve пишет по login-домену, доставка читает по spool-symlink → правила Roundcube не применяются
-[lesson_lavtomate_master_active_empty.md](lesson_lavtomate_master_active_empty.md) — Lavtomate пишет пустой master active.script без `include "roundcube"` → правила Roundcube глохнут; ручной workaround + задание в lavtomate/docs/task-sieve-master-include.md
**Если пароль нужен больше чем одному админу — класть его в rooter password store**, не в локальный `.claude/secrets/credentials.md` и не plaintext в memory/репо.
**Why:** rooter-store даёт шаренный доступ с любой машины (`ssh rooter@server pass show <name>`), gated SSH-ключами rooter (lav, kondratyuk, amegami, mais), хранится на server. `credentials.md` — plaintext только на одном ноутбуке (риск кражи/потери, нет шеринга), плюс это «временное хранение до Vaultwarden». Plaintless в memory — уходит в репо/историю (утечка).
**How to apply:**
- новый shared-пароль → `printf 'SECRET' | ssh rooter@server /usr/local/sbin/admin-pass-add.sh <name>` (или с root@server); коллеги читают через `ssh rooter@server pass show <name>`.
- редактирование/удаление — только root@server.
- Claude для АВТОМАЦИИ пароли НЕ отсюда — через lavtomate `password_request` ([[feedback_password_request_only]]).
`rooter@server` — караульный аккаунт (shell `/home/rooter/bin/rooter.sh`, группы remotelogin+nx, SSH forced-command меню). Доступ **молча сломался**: `/home/rooter` удалили с aspetos (NFS-сервер `/home`) в окне **2025-12-28 → 2026-05-31**. Вместе с home ушли `bin/rooter.sh` (караульный shell) и `.ssh/authorized_keys` → sshd перестал пускать (`Permission denied` по всем методам).
**Диагностика:** на server аккаунт есть (`getent passwd rooter`), в нужных группах, но `/home/rooter/.ssh/` и `bin/rooter.sh` отсутствуют → корень в отсутствии home на NFS-сервере. Проверять home надо на **aspetos** (`/home` там локальный ZFS), не на server (там NFS).
**Восстановление:**`backup/restore-home.sh` (в репо, `backup/`) — тянет `/home/<user>` из PBS (`pve-backup:zlocal`, ns `Files`, backup-id `etersoft-home`, archive `home.pxar`). Запускать на **aspetos** (где `/home` локальный + стоит `proxmox-backup-client`; в чекауте репо на aspetos скрипта может не быть — scp'ить):
```
./restore-home.sh -l snapshots # список снапшотов
./restore-home.sh -l users 2025-12-28T01:02:03Z | grep rooter # есть ли user в снапшоте
./restore-home.sh rooter 2025-12-28T01:02:03Z # restore (skip-existing по умолчанию)
```
rooter был в самом старом снапшоте (2025-12-28), в более свежих (2026-05-31+) уже нет → брать старейший доступный. После restore home виден на server через NFS, SSH-ключ (lav@etersoft.ru ED25519) снова работает, меню «Etersoft rooter (c) 2015» запускается.
**Урок:** «shared-аккаунт перестал пускать по SSH» без видимых причин → проверить наличие `/home/<user>` на NFS home-сервере; восстановить из PBS через `restore-home.sh`. См. также [[reference_rooter_password_store]].
Важно: rooter — караульное меню, **не интерпретирует shell-операторы** (`|`, `>`); `pass show X | wc -c` передаст `|``wc``-c` как литеральные аргументы и просто напечатает значение.
**Добавление/удаление (только root@server, НЕ через меню — read-only для rooter):**
- Store: `/var/lib/admin-pass/` (root:root 700), запись = файл `<name>`.
-`rooter.sh` (`/home/rooter/bin/`, на aspetos/NFS) → case `pass` → `sudo /usr/local/sbin/get-pass.sh` (list/show, read-only, root-owned).
- sudoers: `/etc/sudoers.d/rooter` + `NOPASSWD: /usr/local/sbin/get-pass.sh` (на server активен include `/etc/sudoers.d/`, НЕ `/etc/sudo.d/`).
-`admin-pass-add.sh` (`/usr/local/sbin/`, root-only, НЕ в sudoers) — seeding.
**Свойство безопасности:** меню rooter = только чтение; изменить/удалить может только root@server. Украсть rooter-SSH-ключ → можно читать, но не стирать/портить.
Зачем: пароли под рукой для всех админов, без plaintext в репо/memory и без локального файла на одном ноутбуке. См. [[feedback_shared_passwords_rooter_store]], [[feedback_password_request_only]] (для Claude-автоматизации — отдельный путь через lavtomate password_request ↔ Vaultwarden).