release: 1.9.1: Port-25 Postfix startup with inbound/DMARC/antispam flags
Port-25 Postfix startup when inbound relay, DMARC ingest, or the inbound antispam milter are enabled. Schema-migration reference and roadmap plans for inbound antispam and quarantine. Upgrading from 1.9.0 is a tag bump; no migration. Added: - [docs/plans/inbound-antispam-panel.md](docs/plans/inbound-antispam-panel.md) — - [docs/plans/inbound-quarantine.md](docs/plans/inbound-quarantine.md) — candidate - [docs/schema-migrations.md](docs/schema-migrations.md) — living reference for the Changed: - [docs/roadmap.md](docs/roadmap.md) — `inbound-antispam-panel` (agreed, 1/12) - [docs/development.md](docs/development.md) — plan checklists may override - [docs/development.md](docs/development.md), [docs/roadmap.md](docs/roadmap.md), Fixed: - `build/postfix-config.sh`: enabling inbound relay, DMARC ingest, and/or the Full detail: CHANGELOG.md (1.9.1).
This commit is contained in:
+61
-23
@@ -30,6 +30,8 @@ in `git log` and [CHANGELOG.md](../CHANGELOG.md).
|
||||
|---|---|---|---|---|
|
||||
| contributing | `CONTRIBUTING.md` | candidate | — | — |
|
||||
| panel-docs | In-panel operator documentation | agreed | 6/6 | [plans/panel-docs.md](plans/panel-docs.md) |
|
||||
| inbound-antispam-panel | Inbound antispam journal + allow/deny lists | agreed | 1/12 | [plans/inbound-antispam-panel.md](plans/inbound-antispam-panel.md) |
|
||||
| inbound-quarantine | Inbound spam quarantine (hold / review / release) | candidate | — | [plans/inbound-quarantine.md](plans/inbound-quarantine.md) |
|
||||
| schema-squash | Squash SQLite migrations into a 2.x baseline | **2.x** | — | — |
|
||||
|
||||
**Recommended order** (not binding): the next feature is **panel-docs** once
|
||||
@@ -89,38 +91,74 @@ when checks change; not bloating every page with a second column of prose.
|
||||
|
||||
---
|
||||
|
||||
## inbound-antispam-panel
|
||||
|
||||
**Goal:** panel view of inbound anti-spam decisions (when, from, to, subject,
|
||||
action) plus editable allow/deny lists that tune the external filter — without
|
||||
shipping rspamd or another engine inside the image.
|
||||
|
||||
**Boundary:** metadata journal and list sync only; SelfPost does not run the
|
||||
filter ([product.md](product.md)). Quarantine:
|
||||
[inbound-quarantine](#inbound-quarantine). Design closed in
|
||||
[plans/inbound-antispam-panel.md](plans/inbound-antispam-panel.md) § Decisions.
|
||||
|
||||
**Done when:** with inbound relay enabled, the operator sees journal rows
|
||||
(accepts via inbound-journal milter, rejects via mail.log tailer) and can
|
||||
maintain instance-wide allow/deny lists synced to rspamd maps when the antispam
|
||||
hook is set.
|
||||
|
||||
**Dependencies / risks:** inbound relay `[1.4.0]`; rspamd map/header coupling;
|
||||
journal PII; global-admin-only RBAC.
|
||||
|
||||
**Version:** `1.10.0` MINOR; **agreed**.
|
||||
|
||||
---
|
||||
|
||||
## inbound-quarantine
|
||||
|
||||
**Goal:** optional hold for suspicious inbound mail — review in the panel, then
|
||||
release to upstream, discard, or tune lists. Design not settled.
|
||||
|
||||
**Boundary:** expands inbound from pure relay toward short-lived message
|
||||
storage; may conflict with "no mailboxes" in [product.md](product.md) until
|
||||
product explicitly agrees. Alternatives (rspamd-only quarantine vs SelfPost
|
||||
store) are listed in [plans/inbound-quarantine.md](plans/inbound-quarantine.md).
|
||||
|
||||
**Done when:** TBD after open questions in the plan are answered.
|
||||
|
||||
**Dependencies / risks:** inbound relay `[1.4.0]`; storage/retention/backup
|
||||
size; malware in held MIME; overlap with
|
||||
[inbound-antispam-panel](#inbound-antispam-panel). No implementation checklist
|
||||
yet.
|
||||
|
||||
**Version:** TBD; `candidate` until explicitly agreed.
|
||||
|
||||
---
|
||||
|
||||
## schema-squash
|
||||
|
||||
**Goal:** when 2.x is cut, stop shipping the 1.x migration files
|
||||
(`0001_init.sql` … `0005_panel_users.sql`) in the binary and replace them with
|
||||
one baseline that is the schema as of `user_version = 5`. Fresh 2.x data
|
||||
directories no longer create-then-drop the historical `admin` table.
|
||||
**Goal:** when 2.x is cut, stop shipping the 1.x migration chain in the binary
|
||||
and replace it with one baseline equal to the schema at the then-current head.
|
||||
Fresh 2.x data directories no longer create-then-drop the historical `admin`
|
||||
table. Current chain, legacy notes, and gate thresholds:
|
||||
[schema-migrations.md](schema-migrations.md) (update that file when migrations
|
||||
ship; adjust the squash gate to its head at cut time).
|
||||
|
||||
**Boundary:** 1.x keeps the full chain so a 1.0.0 data directory still boots.
|
||||
Do not delete, rename, or reorder those files while MINOR compatibility with
|
||||
`1.0.0` holds. `migrate()` maps **file order** to `PRAGMA user_version` (`target
|
||||
= i + 1`); dropping a file in 1.x would skip or mis-apply steps on existing
|
||||
databases. Git history keeps the old files either way; only the embedded set
|
||||
in the 2.x image changes.
|
||||
|
||||
**Upgrade gate (required with the squash):**
|
||||
|
||||
| `user_version` | 2.x behaviour |
|
||||
|---|---|
|
||||
| `0` (empty file) | Apply the baseline; set `user_version` to the new chain’s head |
|
||||
| `>= 5` (fully migrated 1.x) | Skip; schema is already the baseline |
|
||||
| `1`…`4` (mid-chain 1.x) | **Refuse to start** — boot the last 1.x once, then 2.x |
|
||||
**Boundary:** 1.x keeps the full chain so a `1.0.0` data directory still boots.
|
||||
Do not delete, rename, or reorder migration files while MINOR compatibility with
|
||||
`1.0.0` holds. Git history keeps the old files either way; only the embedded
|
||||
set in the 2.x image changes.
|
||||
|
||||
Restore remains a separate lock: the backup manifest version must match the
|
||||
running binary ([architecture.md](architecture.md) § Persistence). It does not
|
||||
replace this gate.
|
||||
replace the squash upgrade gate.
|
||||
|
||||
**Done when:** 2.x embeds a single baseline (plus any 2.x-only migrations after
|
||||
it); the gate above is tested; the operator guide says a 2.x image will not
|
||||
open an unfinished 1.x database.
|
||||
it); the gate in [schema-migrations.md](schema-migrations.md) is tested; the
|
||||
operator guide says a 2.x image will not open an unfinished 1.x database.
|
||||
|
||||
**Dependencies / risks:** a decided 2.x cut (another breaking change, or an
|
||||
explicit major). Squashing five short files is not a reason to cut 2.x on its
|
||||
own. A missed gate leaves a `user_version = 3` database silently stuck.
|
||||
explicit major). Squashing the current short chain is not a reason to cut 2.x on
|
||||
its own. A missed gate leaves a mid-chain 1.x database silently stuck.
|
||||
**Version:** `2.x` major only; not a 1.x item.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user