Skip to content

fix(miniflux): derive advertised local URLs from the selected port - #5237

Closed
tang-vu wants to merge 1 commit into
Osmantic:public-betafrom
tang-vu:fix/beta-miniflux-advertised-port-20260915
Closed

tang-vu wants to merge 1 commit into
Osmantic:public-betafrom
tang-vu:fix/beta-miniflux-advertised-port-20260915

Conversation

@tang-vu

@tang-vu tang-vu commented Sep 15, 2026 •

Copy link
Copy Markdown
Contributor

Why this matters

When an operator changes only MINIFLUX_PORT, Miniflux's Integrations page still advertises bookmarklet, Fever, and Google Reader URLs at localhost:8098. The old guide required a second URL edit. Derive the localhost origin from the selected port so that one local-port setting is sufficient, while preserving every explicit nonempty MINIFLUX_BASE_URL for reverse proxies and URL prefixes.

Changing Compose alone is insufficient: the Extensions form initializes values from the catalog, whose old nonempty URL default would override the new derivation. Update the manifest and generated catalog to use an empty optional URL default, and explain how existing installations opt in by clearing a saved URL and recreating the application. Existing external URLs, browser bookmarks, and clients are never silently rewritten.

Overlap check

Searched open and closed upstream PRs for miniflux, miniflux port, miniflux bookmarklet, and base-URL/port keywords, then checked the historical and recent changed-file indexes for the Miniflux recipe/manifest and catalog. #4881 introduced the now-merged native service; #4982 fixes credential display, and #5057 provides a different FreshRSS service. None derives Miniflux's advertised local URLs or removes the form's stale default. #4912 handles Baserow's separate public-URL contract and is not replaced.

Invariant and validation

Candidate 52f9a9696b9f8babcc08e5ba7c5a74a4b2ee5c10, base 33155fb5c4a99242b6fa8eb6e2d9b108c869e3cc:

  • Unset/empty URL derives http://localhost:<published-port>; any explicit URL wins. The internal listener remains 8080 and auth/database settings remain unchanged.
  • Before implementation: 3 failed / 7 passed, including the actual authenticated Integrations page showing the wrong bookmarklet origin. A separate regression proves the old catalog form default still pins 8098 even after fixing Compose.
  • ODS_TEST_MINIFLUX_LINKS=1 ODS_TEST_MINIFLUX_DOCKER=1 python -m pytest ods/tests/test_miniflux_advertised_port.py ods/tests/test_miniflux_extension.py -q -s: 13 passed, 134 seconds, Linux amd64 Docker/WSL.
  • The new native test starts the real recipe on a selected available custom port, signs in through the actual CSRF-protected form, inspects generated bookmarklet/Fever URLs, and follows the bookmarklet destination. Existing Miniflux tests additionally verify generated catalog parity, required credentials, private DB topology, authenticated API access, punctuation-bearing DB passwords, and retained records after recreation. Temporary containers/networks are cleaned up.
  • Images remain the shipped Miniflux 2.3.3 digest 49d7b60987616387c306a8023087b31f2c9b7b21288b523026cb04058e8b6dbb and PostgreSQL 17.11 digest 18cfe3ef5e6815560c98237d6216d1e5119702fb0f3894c8785dd58b8bbe5d73. No image upgrade is included.
  • A path-scoped CI job runs both complete suites, including native containers. Scoped pre-commit and git diff --check passed. make gate is tracked with the batch; the unchanged base has two existing no-sudo Docker fixture failures (fix(installer): honor unavailable sudo in Docker fallback #3158). No green full local gate is claimed.

The initial test incorrectly requested GET /login (the native login form is GET /, with POST /login); that harness error was corrected before recording the behavioral red result. No browser interaction, native macOS/Windows/ARM, external TLS reverse proxy, or third-party Fever client qualification is claimed. Explicit hostname/prefix precedence is validated in rendered plans; the real Web UI qualification uses localhost.

Compatibility and rollback

This is independently useful and has no dependency on another batch PR. Catalog edits were reconciled and checked on the combined head. Rollback restores the previous default; explicitly configured URLs remain the operator's source of truth. Recreate the application after changing configuration, then recopy affected links. Database contents are untouched. Final CI/integration receipts are below.

Versioned external contract: Miniflux 2.3.3 Integrations template uses the configured root URL for these generated links.

Completed batch integration

Synthetic integration: b2ebc8bcab0385ed7b549d6cd61edb776f98ddd5, based on public-beta at 33155fb5c4a99242b6fa8eb6e2d9b108c869e3cc. This fork-only integration branch is not an upstream merge.

Validated merge order: #5177, #5200, #5204, #5218, #5227, #5237, #5245, #5250, #5265, #5288, #5284, #5304, #5332, #5365, #5356, #5367, #5378, #5385, #5392, #5391. Each PR is independently useful; shared catalog/schema/environment/library-index edits must be merged as a union, retaining every distinct entry and the Miniflux explicit-URL precedence change. No production-file conflict was resolved by dropping either behavior. The Bark-specific compatibility notes remain applicable to its separate upstream peers.

  • Final integration head: 235 focused tests passed, 21 opt-in cases skipped, with the native Apprise lifecycle enabled; 52/52 manifests, a 34-service Compose plan with no duplicate default bindings, changed-file hooks, direct ShellCheck and git diff --check passed.
  • Broader checks at 3dc78d72a500fa6031830c5dd69806ad7555b1cc: dashboard API 2,900 passed / 2 skipped; UI build passed and lint had 0 errors / 603 existing warnings; all four platform smoke contracts and installer simulation passed. The final head changes only Apprise documentation and its native fixture relative to that head; production/runtime/configuration files are identical.
  • Local baseline limitations remain visible: make gate stops at the same two fix(installer): honor unavailable sudo in Docker fallback #3158 no-sudo Docker fixture failures. BATS is 416 passed / 5 failed, the same five failures reproduced on untouched base (non-GNU Linux detection, root/non-writable-path fixture, three root preflight fixtures). Full local pre-release gate is not claimed green.
  • Native service evidence above is tied to its candidate commit and Linux amd64 Docker qualification. Compose-plan validation does not prove simultaneous 34-service runtime/load, fleet behavior, GPU inference, ARM or native macOS/Windows operation. Those declared limits remain in force.

All 20 PRs are Ready for review; completed PRs were promoted individually. Independent human review is still required for the declared operational boundaries. No PR was merged.

Final PR CI at 52f9a9696b9f8babcc08e5ba7c5a74a4b2ee5c10: 33 successful / 4 skipped, no failed or pending checks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant