Dovecot shared mailboxes на docker-mailserver: вход info@produktor.io в Roundcube показывает все ящики (ano@, andriy.oblivantsev@, postmaster@) как read-only общие папки. Доставка не менялась, пароли других ящиков не тронуты.
Файлы
config/dovecot.cf — mail_plugins = " quota acl", protocol imap с явным списком (quota acl imap_quota — внутри filter $mail_plugins подхватывает filter-level значение из 20-imap.conf и тихо теряет acl), namespace inbox { separator = / } (иначе «All list=yes namespaces must use the same separator»), shared namespace shared/%%u/ (list=children, subscriptions=yes, INDEXPVT), plugin { acl = vfile; acl_shared_dict = file:/var/lib/dovecot/db/shared-mailboxes.db }.
config/user-patches.sh — идемпотентный: mkdir/chown /var/lib/dovecot/db, doveadm acl set … lookup read на все ящики владельцев для user=info@produktor.io (единственный способ заполнить acl_shared_dict), подписки shared-папок для info@. Права в этой сборке Dovecot принимаются ПОЛНЫМИ именами («lookup read»), буквенные («lr») отклоняются («Invalid right»).
README.md — раздел «Shared mailboxes (единый вход info@)» + поведение при апгрейде :latest.
Roundcube (https://mail.produktor.io, вход info@): дерево показывает Shared → все три ящика; список писем shared/ano@produktor.io → «ano self-test 1334»; preview открывает письмо (subject+body).
Регресс: ano@ (gator, GATOR_MAIL_PASS) логинится по IMAP 143 STARTTLS, свои папки на месте, письмо на месте, флаги не менялись; shared-неймспейс для ano@ пуст (SELECT shared/… → «Mailbox doesn't exist»).
Доставка: /etc/postfix/virtual пуст, алиасы не менялись, postfix-accounts.cf идентичен.
docker compose config валиден; user-patches.sh повторный запуск не падает (RUN1/RUN2 OK); полный цикл --force-recreate + старт отработал.
## Что
Dovecot shared mailboxes на docker-mailserver: вход `info@produktor.io` в Roundcube показывает все ящики (`ano@`, `andriy.oblivantsev@`, `postmaster@`) как read-only общие папки. Доставка не менялась, пароли других ящиков не тронуты.
## Файлы
- `config/dovecot.cf` — `mail_plugins = " quota acl"`, `protocol imap` с явным списком (`quota acl imap_quota` — внутри filter `$mail_plugins` подхватывает filter-level значение из 20-imap.conf и тихо теряет `acl`), `namespace inbox { separator = / }` (иначе «All list=yes namespaces must use the same separator»), shared namespace `shared/%%u/` (`list=children`, `subscriptions=yes`, `INDEXPVT`), `plugin { acl = vfile; acl_shared_dict = file:/var/lib/dovecot/db/shared-mailboxes.db }`.
- `config/user-patches.sh` — идемпотентный: `mkdir/chown /var/lib/dovecot/db`, `doveadm acl set … lookup read` на все ящики владельцев для `user=info@produktor.io` (единственный способ заполнить acl_shared_dict), подписки shared-папок для info@. Права в этой сборке Dovecot принимаются ПОЛНЫМИ именами («lookup read»), буквенные («lr») отклоняются («Invalid right»).
- `README.md` — раздел «Shared mailboxes (единый вход info@)» + поведение при апгрейде :latest.
## Проверено (реальные данные)
- IMAP как info@ (:143 STARTTLS): NAMESPACE показывает shared/; LIST "" "*" включает shared/ano@produktor.io, shared/postmaster@produktor.io, shared/andriy.oblivantsev@produktor.io (+ подпапки); SELECT shared/ano@produktor.io → READ-ONLY, 1 EXISTS; FETCH письма «ano self-test 1334» (subject + body «produktor-mail two-way check: SEND ok.»).
- Roundcube (https://mail.produktor.io, вход info@): дерево показывает Shared → все три ящика; список писем shared/ano@produktor.io → «ano self-test 1334»; preview открывает письмо (subject+body).
- Регресс: ano@ (gator, GATOR_MAIL_PASS) логинится по IMAP 143 STARTTLS, свои папки на месте, письмо на месте, флаги не менялись; shared-неймспейс для ano@ пуст (SELECT shared/… → «Mailbox doesn't exist»).
- Доставка: /etc/postfix/virtual пуст, алиасы не менялись, postfix-accounts.cf идентичен.
- `docker compose config` валиден; user-patches.sh повторный запуск не падает (RUN1/RUN2 OK); полный цикл `--force-recreate` + старт отработал.
Dovecot ACL + shared namespace (shared/%%u/), acl_shared_dict in mail-state,
idempotent user-patches.sh grants info@ read-only (lookup read) on every
mailbox of ano@, andriy.oblivantsev@, postmaster@ and pre-subscribes the
shared folders so Roundcube's subscribed folder list shows them. Delivery and
passwords untouched; other accounts see no shared folders.
eSlider
merged commit f424b9d324 into main2026-09-01 16:03:41 +01:00
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.
Что
Dovecot shared mailboxes на docker-mailserver: вход
info@produktor.ioв Roundcube показывает все ящики (ano@,andriy.oblivantsev@,postmaster@) как read-only общие папки. Доставка не менялась, пароли других ящиков не тронуты.Файлы
config/dovecot.cf—mail_plugins = " quota acl",protocol imapс явным списком (quota acl imap_quota— внутри filter$mail_pluginsподхватывает filter-level значение из 20-imap.conf и тихо теряетacl),namespace inbox { separator = / }(иначе «All list=yes namespaces must use the same separator»), shared namespaceshared/%%u/(list=children,subscriptions=yes,INDEXPVT),plugin { acl = vfile; acl_shared_dict = file:/var/lib/dovecot/db/shared-mailboxes.db }.config/user-patches.sh— идемпотентный:mkdir/chown /var/lib/dovecot/db,doveadm acl set … lookup readна все ящики владельцев дляuser=info@produktor.io(единственный способ заполнить acl_shared_dict), подписки shared-папок для info@. Права в этой сборке Dovecot принимаются ПОЛНЫМИ именами («lookup read»), буквенные («lr») отклоняются («Invalid right»).README.md— раздел «Shared mailboxes (единый вход info@)» + поведение при апгрейде :latest.Проверено (реальные данные)
docker compose configвалиден; user-patches.sh повторный запуск не падает (RUN1/RUN2 OK); полный цикл--force-recreate+ старт отработал.