De-risk spike confirmed emersion/go-milter v0.4.1 (BSD-2) interoperates with Postfix 3.7.11 (bookworm) over protocol v6: reads From/To(per-rcpt)/Subject/ queue-id, gets client IP from Connect(), and fails open when the milter dies. Progress tracker updated; Phase 1 (Docker + supervisord) is next. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
7.0 KiB
Прогресс реализации SelfPost
Живой трекер фаз. Переживает /clear — читается первым при возобновлении работы.
План фаз: implementation-plan.md. ТЗ: specification.md.
Как возобновить после сброса контекста
- Прочитать этот файл (текущая фаза, статус, что сделано, что дальше).
- Прочитать соответствующую фазу в
implementation-plan.md. - При необходимости — детали в
specification.md. - Продолжить с пункта «Следующий шаг».
Рекомендуемая модель по фазам
| Фаза | Модель | Почему |
|---|---|---|
| 0 — каркас + спайк milter | Opus | архитектура + главный технический риск (7.3) |
| 1 — Docker/supervisord/обёртка | Opus | тонкая логика холодного старта сокетов |
| 2 — SQLite/setup-link/auth | Opus | безопасность 7.6 (крипто-токен, сессии, bcrypt) |
| 3 — домены + OpenDKIM | Opus | генерация конфигов + exec-safety (7.6.3–4) |
| 4 — приложения + SASL + sender_login_maps | Opus | риск open relay / привязки отправителя |
| 5 — полный Postfix | Opus | самый чувствительный тракт доставки |
| 6 — journal-milter | Opus | наивысший риск (баг ломает релей) |
| 7 — UI мониторинга | Sonnet | шаблоны/CRUD, рутинно |
| 8 — rate limit L2 | Opus | логика лимитов в milter |
| 9 — бэкап/restore/экспорт | Opus | целостность данных, версионирование |
| 10 — деплой + docs | Sonnet | compose-файлы и документация |
| 11 — security-проход | Opus | аудит соответствия 7.6 |
Правило: безопасность / инфра / риск-критичное → Opus; UI / документация / бойлерплейт → Sonnet; тривиальная механика → Haiku.
Коммиты
Коммит на каждом осмысленном шаге (не каждое сохранение файла, но и не только конец фазы): рабочий под-функционал, зелёная сборка, конец фазы. Минимум — один коммит на закрытую фазу + промежуточные на связные под-шаги. Ветка main (если пользователь не попросит отдельную). Push/PR — только по явной команде. Сообщение коммита завершается трейлером Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>.
Протокол закрытия фазы
Перед /clear в конце каждой фазы Claude:
- Обновляет этот файл: статус фазы → ✅, заполняет «Сделано» и «Следующий шаг».
- Проверяет критерии «Готово, когда…» из плана.
- Пишет одну строку в журнал ниже.
- Делает финальный коммит фазы.
- Явно говорит: «Фаза N закрыта — можно
/clear, следующая фаза N+1 на модели X».
Текущее состояние
- Текущая фаза: 0 ✅ закрыта → следующая Фаза 1 (Docker + supervisord + три процесса)
- Модель для Фазы 1: Opus
- Статус: каркас собран и проверен на сервере; спайк milter снял главный риск ТЗ 7.3
- Следующий шаг (Фаза 1):
Dockerfile(bookworm-slim: postfix, opendkim, cyrus-sasl, supervisor, logrotate);supervisord.confсpriority=(opendkim→panel→postfix); стартовая обёртка Postfix с ожиданием milter-сокетов; панель:8080с заглушкой + stub journal-milter listener + stub log-tailer; непривилегированный пользователь панели. Проверка:docker build, контейнер стартует, три процесса живы.
Сделано в Фазе 0
- Go-модуль
codeberg.org/mix/selfpost, каркасcmd/panel+cmd/selfpost-backup, общийinternal/buildinfo(версия через ldflags). Makefile(статическая сборкаCGO_ENABLED=0),LICENSE(полный AGPL-3.0), скелетREADME.md,.gitattributes(LF).- Проверено на сервере:
go vetчист,make buildдаёт статические бинарники, версия впечатывается. - Спайк go-milter (де-риск ТЗ 7.3): v0.4.1 (BSD-2) ↔ Postfix 3.7.11 bookworm, протокол v6. Подтверждено чтение From/To(per-rcpt)/Subject/queue-id, client IP из Connect(), fail-open при падении milter'а. Детали:
dev/spike-milter-notes.md. - Провижён dev-сервер: Go 1.26.5, Docker 29.6.1, git, rsync, make. Host-postfix (спайковый) остановлен+отключён.
Рабочая петля (dev loop) — ВАЖНО
Локально (Windows, <repo>) нет Go и Docker — только редактирование и git. Вся сборка/тесты идут на dev-сервере selfpost.example.com (Debian 12 bookworm, тот же, что базовый образ; провижён под разработку). Цикл: править локально → rsync дерева на сервер → go build/go vet/docker build/тесты там. Источник истины и git-история — локальный репозиторий; сервер — только исполнитель сборки/тестов. Подключение: ssh root@selfpost.example.com (по ключу).
Утверждённые решения
- Module path:
codeberg.org/mix/selfpost - SQLite:
modernc.org/sqlite(чистый Go, без cgo) - milter:
github.com/emersion/go-milter(проверить совместимость в Фазе 0) - Структура: стандартная Go-раскладка (
cmd/,internal/) - Front-end:
html/template+ вендоренный HTMX - Коммиты — только по явной команде пользователя (ТЗ 12.1)
Журнал фаз
- Фаза 0 (2026-07-11, Opus) — каркас проекта + build-пайплайн + спайк go-milter (риск ТЗ 7.3 снят). Коммиты
4e589e1(каркас),87388b4(план).