docs: restructure UPGRADE.md into operator and developer guides#496
Conversation
Splits the 2.x -> 3.0 guide by role. The operator guide separates application-config migration from infrastructure config, uses 2.8's app:utils:convert-env-to-3x as the primary config-migration path (replacing the inline rename table, kept as a collapsed manual fallback), documents infra steps for both image-based and bare-metal deployments, and adds pre-upgrade and post-upgrade checklists. The developer guide covers the repository merge/rename, external-template conversion and removed feed types. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Refer to the repository by its current name; the rename to os2display/display is not decided and the guide will be updated if it happens. Drop the remote set-url steps. - The 2.x repositories will be archived only when 2.x no longer receives security updates. - Restructure hosting into four options: A) os2display-docker-server, B) published images with own orchestration, C) GitHub release tarball in a classic nginx setup (new), D) bare metal with the repo checked out. - Use app:update instead of the individual template/screen-layout install commands in step 3. - Expand the table of contents with all subheadings incl. options A-D. - Note feed types were deprecated in 2.x and removed in 3.x. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
tuj
left a comment
There was a problem hiding this comment.
LGTM.
Minor issues raised by AI review. No blockers imo.
AI Review
Verdict: Strong improvement over the linear guide — role split, four hosting-options matrix, and pre/post-upgrade checklists are exactly what a 3.0 migration needs. Coherent with #495 (uses the new convert-env-to-3x converter as the canonical path).
Genuine fixes the PR slips in:
- APP_HTTP_CLIENT_LOG_LEVEL → LOG_LEVEL_OUTBOUND_HTTP (old guide had it staying as HTTP_CLIENT_LOG_LEVEL — wrong).
- The APP_ACTIVATION_CODE_EXPIRE_INTERNAL typo is finally named out loud.
Issues:
-
Pre-upgrade checklist asks operators to "check for feed sources using removed feed types" but the command for that only appears in Step 3 — add the dry-run invocation (or a forward-link) to the checklist itself.
-
Manual fallback rename list shrank from ~50 explicit lines to a verbal rule + 3 exceptions. Either keep the full table inside the <details> block or point at src/Command/Utils/ConvertEnvTo3xCommand.php::ENV_MAP as the source of truth.
-
Step 3 runs doctrine:migrations:rollup then app:update — correct, but a one-line "the rollup makes the migrate phase a no-op" prevents reader confusion.
The flow is:
doctrine:migrations:rollup --no-interactionapp:update --no-interaction(which itself runsdoctrine:migrations:migrate)
After step 1 the consolidated migration is recorded as executed, so step 2's migrate phase is effectively a no-op and only the template/layout install runs. That's the intended behaviour but a passing reader might worry "I just rolled up — won't
app:updateredo migrations?" A one-line "the rollup makes the migrate phase a no-op; templates and layouts install in this step" would close that gap. -
Post-upgrade sanity checks don't include "an existing screen reconnects without re-pairing" — the cheapest single check for a JWT keypair/passphrase mismatch.
The guide repeatedly says "reuse the 2.x keypair and
JWT_PASSPHRASE," which is correct. The post-upgrade sanity checks include/adminlogin but not an explicit check that a 2.x-issued token still validates or that screen JWTs still work. A line like "[ ] An existing screen reconnects without re-pairing" would catch a keypair/passphrase mismatch directly. -
Option C tarball extraction — depending on whether the tarball has a top-level dir, the suggested tar -xzf … -C /var/www/display either lands cleanly or creates a nested dir; document the layout or use --strip-components=1.
- forward-link the removed-feed-type check to the dry-run command - point manual env fallback at ConvertEnvTo3xCommand::ENV_MAP as source of truth - note the rollup makes app:update's migrate phase a no-op - add screen-reconnect sanity check for JWT keypair/passphrase carry-over - document that the release tarball has no top-level directory
Summary
Restructures the 2.x → 3.0 upgrade guide by audience, assuming #495 (
app:utils:convert-env-to-3x) ships in 2.8.Features Added
app:utils:convert-env-to-3x, which converts the loaded env and the admin/clientconfig.jsonin one pass — the fullAPP_*rename table is replaced by a collapsed manual fallback stating the rename rule and its exceptions.task env:migrate/task env:diff).env_file:pattern, volumes forconfig/jwt/+public/media/, nginx/PHP runtime tuning, auto-shippedrelease.json.release.jsonincluded.composer install,npm run build, nginx reference config, hand-writtenrelease.json.app:update-based content migration: step 3 usesapp:update --no-interactioninstead of the individual template/screen-layout install commands, with the list commands kept for inspection..env.localsanity check, post-upgrade sanity checks, and a template-conversion checklist.Files Changed
UPGRADE.md— restructured as above; no upgrade step was dropped (migration rollup, template/layout install viaapp:update, deprecated feed-source cleanup and screen auto-upgrade are all retained, condensed)CHANGELOG.md— entry under[Unreleased]Test Plan
npx markdownlint-cli UPGRADE.md CHANGELOG.md— clean#custom-templates,#configuration,#development-setup,#taskfile) and the TOC anchors exist onrelease/3.0.0app:update,app:feed:remove-deprecated-feed-sources,app:templates:*,app:screen-layouts:*) verified present onrelease/3.0.0.github/workflows/github_build_release.yml(tarball contents, checksum,release.jsonlocations)🤖 Generated with Claude Code