feat(dovecot): incubator owner wheregroup@produktor.io + info@ delete access (#251) #5

Merged
eSlider merged 1 commits from feat/incubator-wheregroup#251 into main 2026-09-02 12:12:54 +01:00
Owner

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.
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.
eSlider added 1 commit 2026-09-02 12:11:05 +01:00
eSlider merged commit 8041ab3962 into main 2026-09-02 12:12:54 +01:00
eSlider deleted branch feat/incubator-wheregroup#251 2026-09-02 12:12:54 +01:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: eSlider/mail-server#5