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 <noreply@anthropic.com>
This commit is contained in:
@@ -5,6 +5,12 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); version
|
|||||||
|
|
||||||
## [Unreleased]
|
## [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
|
### Added
|
||||||
|
|
||||||
- panel-redesign (stage 0): Bulma 1.0.4 and a 57-icon subset of Tabler Icons
|
- 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
|
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
|
relay domain - were not in `relay_recipient_maps`. Their table is a
|
||||||
recipient table now. Hidden until now by the port-25 failure above.
|
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
|
- 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
|
("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
|
running. The Milter sockets card no longer clips its second line with three
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ docker run --rm -d --name selfpost-try \
|
|||||||
-e SELFPOST_HOSTNAME=mail.local.test \
|
-e SELFPOST_HOSTNAME=mail.local.test \
|
||||||
-e PANEL_COOKIE_SECURE=false \
|
-e PANEL_COOKIE_SECURE=false \
|
||||||
-v selfpost-try-data:/data \
|
-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):
|
**Get the setup URL** (pick one):
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
selfpost:
|
selfpost:
|
||||||
image: ghcr.io/mixeme/selfpost:1.9.5
|
image: ghcr.io/mixeme/selfpost:2.0.0
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
SELFPOST_HOSTNAME: "${SELFPOST_HOSTNAME:?set the mail/panel hostname, e.g. mail.example.com}"
|
SELFPOST_HOSTNAME: "${SELFPOST_HOSTNAME:?set the mail/panel hostname, e.g. mail.example.com}"
|
||||||
|
|||||||
+2
-2
@@ -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
|
2. Git tag `vX.Y.Z` and publish the GitHub Release only on explicit request (see
|
||||||
[§ Release image](#release-image)).
|
[§ 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 |
|
| 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) |
|
| 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) |
|
| 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) |
|
| 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) |
|
| 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
|
Docs-only prep (checklists in plans, no product code) uses the same per-step
|
||||||
|
|||||||
+1
-1
@@ -183,7 +183,7 @@ cat ./data/setup-token
|
|||||||
#### Fixed image tag
|
#### Fixed image tag
|
||||||
|
|
||||||
`deploy/docker-compose.yml` pins an explicit version (`ghcr.io/mixeme/selfpost:X.Y.Z`),
|
`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
|
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
|
image was published. Pinning matters because of the backup version check (see
|
||||||
[Full backup and restore](#full-backup-and-restore)): the panel binary's
|
[Full backup and restore](#full-backup-and-restore)): the panel binary's
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Plan: panel-redesign
|
# 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)
|
**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).
|
**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] 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] 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**
|
- [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
|
**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
|
(§ Room for roadmap items): inbound-antispam-panel `2.1.0`; then, in whatever
|
||||||
|
|||||||
+4
-4
@@ -39,12 +39,12 @@ in `git log` and [CHANGELOG.md](../CHANGELOG.md).
|
|||||||
| panel-notifications | E-mail notifications about important events | candidate | — | — |
|
| 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 | — | — |
|
| delivery-log-storage | Keep a message's `mail.log` lines with its send-log row | candidate | — | — |
|
||||||
| password-reset | Password reset by e-mail | 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) |
|
| 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
|
**Recommended order** (not binding; owner, 2026-10-09: feature order follows
|
||||||
development convenience): the next stage is **panel-redesign** (`2.0.0`),
|
development convenience): **panel-redesign** shipped as `2.0.0` (2026-10-11); the next stage is
|
||||||
then **inbound-antispam-panel** (`2.1.0`) built in the new component kit —
|
**inbound-antispam-panel** (`2.1.0`), built in the new component kit —
|
||||||
styling its two screens once instead of twice. panel-docs shipped in
|
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]`
|
[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
|
(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).
|
`design-first` CI step and evidence-based acceptance (plan § Enforcement).
|
||||||
Competes with feature work; Bulma is ~680 kB minified, embedded once.
|
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.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user