From 403ce9399073945b39ec33af3292d06bf63ae4ab Mon Sep 17 00:00:00 2001 From: Mix Date: Sun, 11 Oct 2026 14:32:08 +0300 Subject: [PATCH] release: 2.0.0: Panel redesign; new URLs; database from zero The panel redesign (docs/plans/panel-redesign.md, 27/27). A breaking release: every panel URL changed and the database starts from a single baseline - a 1.x /data is not upgraded. Since the last cut also fixed, all found on the test server: - the panel can read the mail queue; - port 25 answers with DMARC report ingest on, also next to the inbound relay; - DMARC reports reach the panel (the delivery service never worked since 1.7.0); - Postfix start-up warnings about the queue directory. Cut: CHANGELOG [Unreleased] -> [2.0.0]; image pin 2.0.0 in compose, README, guide; roadmap, plan and version table. On the test server, on 252e5d1: go vet ./... ok, go test ./... ok (22 packages), make e2e ok. Full detail: CHANGELOG.md (2.0.0). Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 21 +++++++++++++++++++++ README.md | 2 +- deploy/docker-compose.yml | 2 +- docs/development.md | 4 ++-- docs/guide.md | 2 +- docs/plans/panel-redesign.md | 4 ++-- docs/roadmap.md | 8 ++++---- 7 files changed, 32 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4020088..11d5564 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); version ## [Unreleased] +## [2.0.0] - 2026-10-11 + +The panel redesign. A breaking release: every panel URL changed and the +database starts from zero - a 1.x `/data` is not upgraded (see Changed and +Removed). + ### Added - panel-redesign (stage 0): Bulma 1.0.4 and a 57-icon subset of Tabler Icons @@ -233,6 +239,21 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); version restriction list, and the report addresses - on the server's own name, a relay domain - were not in `relay_recipient_maps`. Their table is a recipient table now. Hidden until now by the port-25 failure above. +- **DMARC reports reach the panel.** A report accepted on port 25 stayed in + the queue: the generated delivery service was a bare `pipe` ("fatal: + missing user= command-line attribute"), because the generator addressed it + under a type Postfix does not have and set `flags=`, `user=` and `argv=` + as `-o` parameters, which they are not. Behind that, the command would + have refused to run (Postfix starts it without the container's + environment) and was never told the recipient, so the check that a report + came to the address of its own domain was skipped. The service line + carries its arguments, the recipient is one of them, and + `export_environment` names what the command reads. No report had been + delivered since the feature shipped in 1.7.0; the e2e check asks Postfix + how it reads the service. +- Postfix no longer logs "warning: not owned by root" for the queue + directory and its `pid/` at every start: the entrypoint hands the two back + to root after its recursive change of owner. - Overview's Processes card counts the programs that are meant to stay up ("6 of 6 running"); the idle one-shot `postfix-reload` was counted as running. The Milter sockets card no longer clips its second line with three diff --git a/README.md b/README.md index 45f4c6b..3385eb8 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ docker run --rm -d --name selfpost-try \ -e SELFPOST_HOSTNAME=mail.local.test \ -e PANEL_COOKIE_SECURE=false \ -v selfpost-try-data:/data \ - ghcr.io/mixeme/selfpost:1.9.5 + ghcr.io/mixeme/selfpost:2.0.0 ``` **Get the setup URL** (pick one): diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml index 0436038..ffbf439 100644 --- a/deploy/docker-compose.yml +++ b/deploy/docker-compose.yml @@ -21,7 +21,7 @@ services: selfpost: - image: ghcr.io/mixeme/selfpost:1.9.5 + image: ghcr.io/mixeme/selfpost:2.0.0 restart: unless-stopped environment: SELFPOST_HOSTNAME: "${SELFPOST_HOSTNAME:?set the mail/panel hostname, e.g. mail.example.com}" diff --git a/docs/development.md b/docs/development.md index 95c2230..37af453 100644 --- a/docs/development.md +++ b/docs/development.md @@ -107,7 +107,7 @@ than the default «meaningful step» rule in [§ Commits and release build](#com 2. Git tag `vX.Y.Z` and publish the GitHub Release only on explicit request (see [§ Release image](#release-image)). -**Planned version cuts** (from pin `1.9.5`; adjust if semver changes mid-track): +**Planned version cuts** (from pin `2.0.0`; adjust if semver changes mid-track): | Stage | ID | Cut | |---|---|---| @@ -123,7 +123,7 @@ than the default «meaningful step» rule in [§ Commits and release build](#com | 10 | panel-redesign prep (docs only, owner-requested cut) | `1.9.3` (PATCH) | | 11 | panel-redesign plan: component kit, stages, reorder (docs only, owner-requested cut) | `1.9.4` (PATCH) | | 12 | GHCR release fix: keep per-arch images, sweep orphaned versions (CI only) | `1.9.5` (PATCH) | -| 13 | panel-redesign | `2.0.0` (planned; MAJOR, no compatibility) | +| 13 | panel-redesign | `2.0.0` (MAJOR, no compatibility) | | 14 | inbound-antispam-panel | `2.1.0` (planned; was `1.10.0`, reordered 2026-10-09) | Docs-only prep (checklists in plans, no product code) uses the same per-step diff --git a/docs/guide.md b/docs/guide.md index 1421c94..7836555 100644 --- a/docs/guide.md +++ b/docs/guide.md @@ -183,7 +183,7 @@ cat ./data/setup-token #### Fixed image tag `deploy/docker-compose.yml` pins an explicit version (`ghcr.io/mixeme/selfpost:X.Y.Z`), -deliberately never `:latest`. The current pin is `1.9.5`. Intermediate +deliberately never `:latest`. The current pin is `2.0.0`. Intermediate CHANGELOG sections (`0.2.0`…`0.6.0`) record development cuts from before that image was published. Pinning matters because of the backup version check (see [Full backup and restore](#full-backup-and-restore)): the panel binary's diff --git a/docs/plans/panel-redesign.md b/docs/plans/panel-redesign.md index fcf3058..d183633 100644 --- a/docs/plans/panel-redesign.md +++ b/docs/plans/panel-redesign.md @@ -1,6 +1,6 @@ # Plan: panel-redesign -**Status:** agreed (owner, 2026-10-09) +**Status:** shipped in `2.0.0` (2026-10-11) **Date:** 2026-09-21 (replaces the 2026-09-08 givens) **Version:** `2.0.0` MAJOR — a breaking release by the owner's decision (§ No compatibility). @@ -532,7 +532,7 @@ only when both are done. Every stage-2 step ends with the evidence of - [x] Technical review of the whole against the mockups, evidence pairs complete — **Opus** - [x] Security review of the route rename, subtree authorization and inbound delegation — **Fable** - [x] guide.md screenshots and wording for the new navigation; architecture.md § Panel HTTP surface and § Persistence; security.md roles; *Removed* in the CHANGELOG with one line that 2.0 starts from an empty data directory; strike the three UI rows of review-2026-08-followups that the redesign retires — **Sonnet** -- [ ] `go vet`, `go test ./...`, e2e suite; version cut `2.0.0` — **Haiku** +- [x] `go vet`, `go test ./...`, e2e suite; version cut `2.0.0` — **Haiku** **After 2.0** — features land in the kit, each from its own plan, mockup first (§ Room for roadmap items): inbound-antispam-panel `2.1.0`; then, in whatever diff --git a/docs/roadmap.md b/docs/roadmap.md index c193ee2..5f12b0f 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -39,12 +39,12 @@ in `git log` and [CHANGELOG.md](../CHANGELOG.md). | panel-notifications | E-mail notifications about important events | candidate | — | — | | delivery-log-storage | Keep a message's `mail.log` lines with its send-log row | candidate | — | — | | password-reset | Password reset by e-mail | candidate | — | — | -| panel-redesign | Panel redesign (accepted mockups, design contract) | agreed | 26/27 | [plans/panel-redesign.md](plans/panel-redesign.md) | +| panel-redesign | Panel redesign (accepted mockups, design contract) | shipped `2.0.0` | 27/27 | [plans/panel-redesign.md](plans/panel-redesign.md) | | schema-squash | Squash SQLite migrations into a 2.x baseline | built in panel-redesign (stage 1) | — | [plans/panel-redesign.md](plans/panel-redesign.md) | **Recommended order** (not binding; owner, 2026-10-09: feature order follows -development convenience): the next stage is **panel-redesign** (`2.0.0`), -then **inbound-antispam-panel** (`2.1.0`) built in the new component kit — +development convenience): **panel-redesign** shipped as `2.0.0` (2026-10-11); the next stage is +**inbound-antispam-panel** (`2.1.0`), built in the new component kit — styling its two screens once instead of twice. panel-docs shipped in [CHANGELOG.md](../CHANGELOG.md) `[1.8.0]`; dmarc-reports in `[1.7.0]` (security review of the ingest path pending); domain-stats-auto-ratelimit in @@ -438,7 +438,7 @@ of their own — answered by guard tests that land before the templates, a `design-first` CI step and evidence-based acceptance (plan § Enforcement). Competes with feature work; Bulma is ~680 kB minified, embedded once. -**Version:** `2.0.0` MAJOR; `agreed` (owner, 2026-10-09). +**Version:** shipped `2.0.0` (2026-10-11), MAJOR. ---