1. Инкубаторный owner-ящик wheregroup@produktor.io — добавлен на live (arc-01) без пересоздания контейнера. Механика (воспроизводимый путь, задокументирован в README «Manage: adding a mailbox without recreating the container»):
docker exec mailserver setup email add wheregroup@produktor.io (пароль из stdin, не из argv) → правка config/postfix-accounts.cf;
changedetector DMS (check-for-changes.sh, poll 2s) сам регенерирует /etc/postfix/vmailbox, /etc/dovecot/userdb, /etc/postfix/vhost и делает postfix reload + dovecot reload. Никакого docker compose up -d.
Случайный пароль в .env (WHEGROUP_PASSWORD), .env не коммитится (postfix-accounts.cf тоже gitignored — в PR только политика).
2. config/user-patches.sh — два класса владельцев (полные имена прав, не буквы):
production (ano@, andriy.oblivantsev@, postmaster@): lookup read — как было (#79), регресс подтверждён;
Скрипт стал самодостаточным: пропускает owner'ов, которых ещё нет в postfix-accounts.cf (лог skip <owner>), и сам создаёт INBOX новому владельцу до прогона ACL (без INBOX doveadm mailbox list пуст и shared-запись не создаётся).
3. Права для инкубатора определены на live эмпирически (doveadm acl + IMAP-тест как info@):
write-deleted достаточно для флага \Deleted, который Roundcube ставит кнопкой Delete — отдельный write НЕ нужен;
expunge даёт и UID EXPUNGE, и MOVE-семантику (Roundcube с дефолтным trash_mbox=Trash делает MOVE в личный Trash info@ — Dovecot требует expunge на источнике);
delete — по архрешению (#250), удаление mailbox-объекта.
4. README — Accounts (гдеgroup + WHEGROUP_PASSWORD), Shared mailboxes (два класса прав), Manage (добавление ящика без пересоздания + INBOX-нюанс).
Верификация (live, arc-01)
doveadm user wheregroup@produktor.io резолвится; doveadm mailbox list -u wheregroup@produktor.io → INBOX.
info@: doveadm mailbox list показывает shared/wheregroup@produktor.io; IMAP LIST (imaps 993) тоже.
IMAP как info@: FETCH из Shared/wheregroup ок; STORE +FLAGS (\Deleted) ок; EXPUNGE удаляет письмо; MOVE 1 Trash ок (письмо ушло из wheregroup).
Регресс #79: на Shared/ano@produktor.ioSTORE +FLAGS (\Deleted) молча игнорируется (нет прав), ACL боевых = lookup read без изменений.
user-patches.sh прогнан 2× подряд — rc=0, идемпотентен.
Тестовые письма вычищены, гдеgroup остался с пустым INBOX.
Open: bind-mount legacy-корпуса в mailserver compose (37GB, /mnt/.../var/mail → /legacy-mail:ro) — решается в A2.
Issue: eSlider/2dph#251 (epic #250, mail-server PR-only repo).
## Что сделано
**1. Инкубаторный owner-ящик `wheregroup@produktor.io`** — добавлен на live (arc-01) без пересоздания контейнера. Механика (воспроизводимый путь, задокументирован в README «Manage: adding a mailbox without recreating the container»):
- `docker exec mailserver setup email add wheregroup@produktor.io` (пароль из stdin, не из argv) → правка `config/postfix-accounts.cf`;
- changedetector DMS (`check-for-changes.sh`, poll 2s) сам регенерирует `/etc/postfix/vmailbox`, `/etc/dovecot/userdb`, `/etc/postfix/vhost` и делает `postfix reload` + `dovecot reload`. Никакого `docker compose up -d`.
- Случайный пароль в `.env` (`WHEGROUP_PASSWORD`), `.env` не коммитится (postfix-accounts.cf тоже gitignored — в PR только политика).
**2. `config/user-patches.sh` — два класса владельцев** (полные имена прав, не буквы):
- production (`ano@`, `andriy.oblivantsev@`, `postmaster@`): `lookup read` — как было (#79), регресс подтверждён;
- incubator (`wheregroup@produktor.io`, в перспективе `gmail_lenovo@`, `tb-*`/`pst-*`): `lookup read delete expunge write-deleted`.
- Скрипт стал самодостаточным: пропускает owner'ов, которых ещё нет в postfix-accounts.cf (лог `skip <owner>`), и сам создаёт INBOX новому владельцу до прогона ACL (без INBOX `doveadm mailbox list` пуст и shared-запись не создаётся).
**3. Права для инкубатора определены на live эмпирически** (doveadm acl + IMAP-тест как info@):
- `write-deleted` достаточно для флага `\Deleted`, который Roundcube ставит кнопкой Delete — отдельный `write` НЕ нужен;
- `expunge` даёт и UID EXPUNGE, и MOVE-семантику (Roundcube с дефолтным `trash_mbox=Trash` делает MOVE в личный Trash info@ — Dovecot требует expunge на источнике);
- `delete` — по архрешению (#250), удаление mailbox-объекта.
**4. README** — Accounts (гдеgroup + WHEGROUP_PASSWORD), Shared mailboxes (два класса прав), Manage (добавление ящика без пересоздания + INBOX-нюанс).
## Верификация (live, arc-01)
- `doveadm user wheregroup@produktor.io` резолвится; `doveadm mailbox list -u wheregroup@produktor.io` → INBOX.
- info@: `doveadm mailbox list` показывает `shared/wheregroup@produktor.io`; IMAP LIST (imaps 993) тоже.
- IMAP как info@: FETCH из `Shared/wheregroup` ок; `STORE +FLAGS (\Deleted)` ок; `EXPUNGE` удаляет письмо; `MOVE 1 Trash` ок (письмо ушло из wheregroup).
- Регресс #79: на `Shared/ano@produktor.io` `STORE +FLAGS (\Deleted)` молча игнорируется (нет прав), ACL боевых = `lookup read` без изменений.
- user-patches.sh прогнан 2× подряд — rc=0, идемпотентен.
- Тестовые письма вычищены, гдеgroup остался с пустым INBOX.
## Осталось
- #252 (A2): ETL `.eml` → `doveadm import` (лимит 1000, Message-ID дедуп).
- Open: bind-mount legacy-корпуса в mailserver compose (37GB, `/mnt/.../var/mail` → `/legacy-mail:ro`) — решается в A2.
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.
Issue: eSlider/2dph#251 (epic #250, mail-server PR-only repo).
Что сделано
1. Инкубаторный owner-ящик
wheregroup@produktor.io— добавлен на live (arc-01) без пересоздания контейнера. Механика (воспроизводимый путь, задокументирован в README «Manage: adding a mailbox without recreating the container»):docker exec mailserver setup email add wheregroup@produktor.io(пароль из stdin, не из argv) → правкаconfig/postfix-accounts.cf;check-for-changes.sh, poll 2s) сам регенерирует/etc/postfix/vmailbox,/etc/dovecot/userdb,/etc/postfix/vhostи делаетpostfix reload+dovecot reload. Никакогоdocker compose up -d..env(WHEGROUP_PASSWORD),.envне коммитится (postfix-accounts.cf тоже gitignored — в PR только политика).2.
config/user-patches.sh— два класса владельцев (полные имена прав, не буквы):ano@,andriy.oblivantsev@,postmaster@):lookup read— как было (#79), регресс подтверждён;wheregroup@produktor.io, в перспективеgmail_lenovo@,tb-*/pst-*):lookup read delete expunge write-deleted.skip <owner>), и сам создаёт INBOX новому владельцу до прогона ACL (без INBOXdoveadm mailbox listпуст и shared-запись не создаётся).3. Права для инкубатора определены на live эмпирически (doveadm acl + IMAP-тест как info@):
write-deletedдостаточно для флага\Deleted, который Roundcube ставит кнопкой Delete — отдельныйwriteНЕ нужен;expungeдаёт и UID EXPUNGE, и MOVE-семантику (Roundcube с дефолтнымtrash_mbox=Trashделает MOVE в личный Trash info@ — Dovecot требует expunge на источнике);delete— по архрешению (#250), удаление mailbox-объекта.4. README — Accounts (гдеgroup + WHEGROUP_PASSWORD), Shared mailboxes (два класса прав), Manage (добавление ящика без пересоздания + INBOX-нюанс).
Верификация (live, arc-01)
doveadm user wheregroup@produktor.ioрезолвится;doveadm mailbox list -u wheregroup@produktor.io→ INBOX.doveadm mailbox listпоказываетshared/wheregroup@produktor.io; IMAP LIST (imaps 993) тоже.Shared/wheregroupок;STORE +FLAGS (\Deleted)ок;EXPUNGEудаляет письмо;MOVE 1 Trashок (письмо ушло из wheregroup).Shared/ano@produktor.ioSTORE +FLAGS (\Deleted)молча игнорируется (нет прав), ACL боевых =lookup readбез изменений.Осталось
.eml→doveadm import(лимит 1000, Message-ID дедуп)./mnt/.../var/mail→/legacy-mail:ro) — решается в A2.