<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.tetrain.com/index.php?action=history&amp;feed=atom&amp;title=Wiki.tetrain.com_Upgrade_Plan</id>
	<title>Wiki.tetrain.com Upgrade Plan - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.tetrain.com/index.php?action=history&amp;feed=atom&amp;title=Wiki.tetrain.com_Upgrade_Plan"/>
	<link rel="alternate" type="text/html" href="https://wiki.tetrain.com/index.php?title=Wiki.tetrain.com_Upgrade_Plan&amp;action=history"/>
	<updated>2026-07-25T18:56:53Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.tetrain.com/index.php?title=Wiki.tetrain.com_Upgrade_Plan&amp;diff=4208&amp;oldid=prev</id>
		<title>Admin: Publish upgrade plan documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.tetrain.com/index.php?title=Wiki.tetrain.com_Upgrade_Plan&amp;diff=4208&amp;oldid=prev"/>
		<updated>2026-07-25T16:41:28Z</updated>

		<summary type="html">&lt;p&gt;Publish upgrade plan documentation&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Status: &amp;#039;&amp;#039;&amp;#039;live in production (2026-07-25).&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; now serves the migrated MediaWiki 1.43.9 site on Rocky 9; the old CentOS 7 box is reachable at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki-old.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pending decommission. This document is being written and updated as work proceeds, same living-document pattern as the tornedo.tetrain.com plan.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;This is the decision log&amp;#039;&amp;#039;&amp;#039; (why each choice was made, problems hit, alternatives considered). For a reproducible, command-by-command sequence you could actually follow to redo this migration, see [[Wiki.tetrain.com Runbook|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki.tetrain.com_RUNBOOK.md&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;]] instead.&lt;br /&gt;
&lt;br /&gt;
== 1. Source state (read-only discovery, 2026-07-24) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (172.105.56.64, aka &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;li2092-64.members.linode.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Layer !! Version !! Status&lt;br /&gt;
|-&lt;br /&gt;
| OS || CentOS Linux 7.7.1908 || EOL&lt;br /&gt;
|-&lt;br /&gt;
| Kernel || 3.10.0-1062 (2019) || EOL&lt;br /&gt;
|-&lt;br /&gt;
| Web server || Apache httpd 2.4.6 || HTTP only, no TLS&lt;br /&gt;
|-&lt;br /&gt;
| PHP || 5.4.16 || EOL since Sept 2015&lt;br /&gt;
|-&lt;br /&gt;
| Database || MariaDB 5.5.64 || EOL since April 2020&lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki || &amp;#039;&amp;#039;&amp;#039;1.18.4&amp;#039;&amp;#039;&amp;#039; (Feb 2012) || ~14 years old, ~20+ major versions behind&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Data footprint: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;my_wiki&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; DB 81.6 MB; &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;images/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 444 MB (209 MB thumb cache — regeneratable, 18 MB archive, rest originals); whole install 736 MB. VM itself is tiny (990 MB RAM, 25 GB disk, 4.3 GB used) — data-light migration, most of the risk is in code/extension compatibility, not data volume.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Extensions (12 installed):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* 9 standard/officially-maintained: CheckUser, ConfirmEdit, Gadgets, Nuke, ParserFunctions, Renameuser, TimedMediaHandler, Vector, WikiEditor — current versions exist for any modern MediaWiki release.&lt;br /&gt;
* 3 old third-party, unmaintained since 2011-2015, will not run under PHP 8 as-is:&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;HTML5video&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (2011) — self-hosted video embed. Functionally superseded by &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;TimedMediaHandler&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, already installed. &amp;#039;&amp;#039;&amp;#039;Decision: drop, don&amp;#039;t port.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;MsUpload&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (drag-and-drop bulk upload, v10, Schwindl/Schenone) — has a real mediawiki.org page and known community forks. Needs a compatible-fork check.&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;UserAdmin&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (2012, Lance Gatlin) — admin panel: add/edit/purge users, mass block, password-reset/welcome emails, for private-wiki tighter control. Old, possibly abandoned upstream; core MediaWiki&amp;#039;s own user-management special pages cover much of this now.&lt;br /&gt;
&lt;br /&gt;
No TLS currently configured anywhere (no mod_ssl, no certbot).&lt;br /&gt;
&lt;br /&gt;
== 2. Why this is not an in-place/leapp-style upgrade ==&lt;br /&gt;
&lt;br /&gt;
# PHP 5.4 → 8.x is a language-level break — MediaWiki 1.18&amp;#039;s own code will not run under PHP 8 (removed functions, changed OOP semantics). No version of &amp;quot;just bump PHP under the existing codebase&amp;quot; exists.&lt;br /&gt;
# MediaWiki&amp;#039;s own upgrade policy does not support jumping ~20 major versions directly. Confirmed via mediawiki.org and the project&amp;#039;s own UPGRADE file: &amp;quot;upgrading from releases older than two LTS releases is not supported... upgrade to a more recent LTS version first, then to this version.&amp;quot; For a source as old as 1.18 (pre-dates the first LTS release in this scheme), the safe/documented path is to walk every LTS stop in sequence.&lt;br /&gt;
&lt;br /&gt;
== 3. Chosen approach ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Target OS: Rocky Linux 9&amp;#039;&amp;#039;&amp;#039; (chosen over 10 — more production-proven at this point).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Target MediaWiki: 1.43 LTS&amp;#039;&amp;#039;&amp;#039; (supported through Dec 2027; requires PHP 8.1+, MariaDB 10.1+/MySQL 5.5.8+). Chosen over the newer 1.46 stable for production stability.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Migration mechanism: disposable Docker containers, one per LTS hop&amp;#039;&amp;#039;&amp;#039;, since the hop chain needs several different PHP versions that can&amp;#039;t sanely coexist natively on one Rocky 9 box. Official MediaWiki Docker Hub images only retain current-era tags, so each hop is built from the official &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;php&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; image (which does keep full historical tags) plus the matching MediaWiki release tarball downloaded directly from releases.wikimedia.org.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;LTS hop chain&amp;#039;&amp;#039;&amp;#039; (confirmed via mediawiki.org release history — [https://www.mediawiki.org/wiki/Compatibility Compatibility], [https://www.mediawiki.org/wiki/Manual:Upgrading Manual:Upgrading]): 1.18.4 (source) → &amp;#039;&amp;#039;&amp;#039;1.23.16&amp;#039;&amp;#039;&amp;#039; → &amp;#039;&amp;#039;&amp;#039;1.27.7&amp;#039;&amp;#039;&amp;#039; → &amp;#039;&amp;#039;&amp;#039;1.31.16&amp;#039;&amp;#039;&amp;#039; → &amp;#039;&amp;#039;&amp;#039;1.35.13&amp;#039;&amp;#039;&amp;#039; → &amp;#039;&amp;#039;&amp;#039;1.39.11&amp;#039;&amp;#039;&amp;#039; → &amp;#039;&amp;#039;&amp;#039;1.43.2&amp;#039;&amp;#039;&amp;#039;. One DB instance (MariaDB 10.11) persists across every hop; only the PHP runtime + MediaWiki codebase change per hop. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update.php&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; run at each stop reconciles the schema forward; extensions are deliberately *not* loaded during the hop chain (minimal &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;LocalSettings.php&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, DB connection only) since the goal is walking the core schema, not extension data — extensions get reconciled once on the final 1.43 codebase.&lt;br /&gt;
* Final production runtime: native (not Docker) on Rocky 9, matching the rest of the fleet&amp;#039;s operational pattern — PHP 8.1+, MariaDB 10.11 LTS, httpd or nginx+php-fpm, TLS via Let&amp;#039;s Encrypt (client has already pointed DNS at the new box).&lt;br /&gt;
&lt;br /&gt;
== 4. Target server ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki-new.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, 172.105.39.56, Rocky Linux 9.8, provided by client 2026-07-24. DNS already pointed here by client. Root access via &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;id_rsa_curio&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (fleet-standard key). 1 vCPU / 1.9 GB RAM / 49 GB disk.&lt;br /&gt;
&lt;br /&gt;
== 5. Progress log ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;2026-07-24&amp;#039;&amp;#039;&amp;#039;: Base OS setup done — hostname set, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;dnf update&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; run (kernel bumped to 5.14.0-687.29, reboot will be needed before go-live to run the current kernel), firewalld enabled, Docker CE 29.6.2 + compose installed.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;2026-07-24&amp;#039;&amp;#039;&amp;#039;: Backup of source &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; interrupted — its SSH port stopped responding mid-session (ICMP still fine, port 22 silently drops; not an auth issue, no other access path available). Cause unconfirmed (possible fail2ban-style ban, possible resource event on the tiny 990MB-RAM box, possibly provider-side). Backup poller running in background, will resume the backup the moment it&amp;#039;s reachable again.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;2026-07-24&amp;#039;&amp;#039;&amp;#039;: On &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki-new.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;: persistent MariaDB 10.11 container started for the hop chain (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;mw-mariadb&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, network &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;mwmigrate&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, data volume &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;/root/mw-hop-migration/db-data&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;). Downloaded all 6 hop-chain release tarballs (1.23.16/1.27.7/1.31.16/1.35.13/1.39.11/1.43.2) into &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;/root/mw-hop-migration/tarballs/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Building 6 Docker images (one per hop, PHP versions 5.6/5.6/7.2/7.4/8.0/8.1 matched to each MediaWiki version&amp;#039;s supported range) — in progress.&lt;br /&gt;
* Real hop-chain execution against actual production data is blocked on the backup (see above) — the mechanics can be smoke-tested on an empty schema, but the meaningful test needs the real 1.18.4 data since that&amp;#039;s where any real incompatibility would surface.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;2026-07-24&amp;#039;&amp;#039;&amp;#039;: All 6 hop Docker images built successfully (PHP 5.6/5.6/7.2/7.4/8.0/8.1 with mysqli, intl, gd, mbstring, calendar, opcache compiled in).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;2026-07-24&amp;#039;&amp;#039;&amp;#039;: Extension decisions finalized:&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;HTML5video&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — drop, superseded by &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;TimedMediaHandler&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (already installed).&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;MsUpload&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — turns out to be an official Wikimedia-mirrored extension (not truly third-party as first assessed), actively maintained, confirmed working on 1.43 by other users. Will pull &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wikimedia/mediawiki-extensions-MsUpload&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; on the &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;REL1_43&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; branch.&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;UserAdmin&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — confirmed abandoned upstream, no reliable PHP8-compatible fork. Its functionality (add/edit/delete users, group management, password-reset/welcome emails) is fully covered by core MediaWiki&amp;#039;s own special pages (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;Special:UserRights&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;Special:Block&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;Special:PasswordReset&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;Special:CreateAccount&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;). &amp;#039;&amp;#039;&amp;#039;Decision: drop, don&amp;#039;t port&amp;#039;&amp;#039;&amp;#039; — flag this explicitly at handover so nobody goes looking for the old UserAdmin panel URL and finds it missing without knowing why.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;2026-07-24&amp;#039;&amp;#039;&amp;#039;: Production stack built on &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki-new.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, independent of the pending backup:&lt;br /&gt;
** Apache 2.4.62 + PHP-FPM 8.3.31 (mysqlnd, gd, mbstring, xml, intl, opcache) wired via &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;proxy:unix:/run/php-fpm/www.sock&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
** MariaDB 10.11.18, hardened (anonymous users removed, remote root removed, test DB dropped), &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;my_wiki&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; DB created with a &amp;#039;&amp;#039;&amp;#039;dedicated scoped &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wikiuser&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; account&amp;#039;&amp;#039;&amp;#039; — not &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;root&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; like the old box. Credentials generated randomly, stored root-only-readable at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;/root/.mariadb_root_credentials&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;/root/.wiki_db_credentials&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; on the box itself, never transmitted through chat.&lt;br /&gt;
** firewalld opened for http/https.&lt;br /&gt;
** Let&amp;#039;s Encrypt cert issued and deployed via certbot (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;--redirect&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, HTTP→HTTPS enforced), auto-renewal configured, expires 2026-10-22. Confirmed serving HTTPS correctly (403 is expected — empty docroot, MediaWiki not deployed yet).&lt;br /&gt;
* Only remaining blocker for real progress: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; SSH still unreachable (~26 min and counting as of this note) — site itself (HTTP) confirmed still up and serving fine, so this is SSH-specific, not a box-down event. Background poller watching for recovery.&lt;br /&gt;
&lt;br /&gt;
== 6. Migration completed (2026-07-24) — ready for client testing ==&lt;br /&gt;
&lt;br /&gt;
* Backup recovered once &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; SSH came back (client confirmed cause: their VPN had disconnected — nothing wrong with the box itself). DB (47MB), images (215MB), and extensions/config (161MB, archival only) transferred to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki-new.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, integrity verified via MD5.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Full 6-hop version-hop chain run against the real production data&amp;#039;&amp;#039;&amp;#039;, not just a smoke test: 1.18.4 → 1.23.16 → 1.27.7 → 1.31.16 → 1.35.13 → 1.39.11 → &amp;#039;&amp;#039;&amp;#039;1.43.9&amp;#039;&amp;#039;&amp;#039; (switched from the initially-grabbed 1.43.2 to the latest 1.43.x patch after 1.43.2&amp;#039;s pinned Composer dependencies hit security-advisory blocks — 1.43.9 resolved cleanly). Every hop&amp;#039;s &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update.php&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; completed with zero real errors. Data integrity confirmed identical before/after: 1707 pages, 3634 revisions, 163 users.&lt;br /&gt;
* Migrated DB exported from the migration container and imported into the real production MariaDB (scoped &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wikiuser&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; account, not root).&lt;br /&gt;
* MediaWiki 1.43.9 codebase deployed to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;/var/www/wiki&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, Composer dependencies installed properly (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;composer install --no-dev&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
* All 9 standard extensions + &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;MsUpload&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pulled at the &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;REL1_43&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; branch (CheckUser, ConfirmEdit, Gadgets, Nuke, ParserFunctions, Renameuser, TimedMediaHandler, WikiEditor, Vector skin, MsUpload) — MediaWiki&amp;#039;s own 1.43.9 tarball already bundles most of these, only Renameuser/TimedMediaHandler/MsUpload needed fetching separately. Confirmed all 9 loaded correctly via &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;Special:Version&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Images copied in (originals + archive, 236MB total incl. fresh-install defaults), SELinux contexts set correctly (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;httpd_sys_rw_content_t&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; on images/cache dirs — Rocky 9 is enforcing by default).&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;LocalSettings.php&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; written fresh for the new environment: proper &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wgServer&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (HTTPS), freshly generated &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wgSecretKey&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wgUpgradeKey&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (not the placeholder used during migration testing), scoped DB credentials pulled from &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;/root/.wiki_db_credentials&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (never displayed in chat).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;End-to-end verification, all passing&amp;#039;&amp;#039;&amp;#039;: homepage loads (200, correct site title &amp;quot;TetraWiki&amp;quot;), a real migrated content page renders correctly (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;ISGEC_-_Next_Cloud_Deployment&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;), direct image serving works, &amp;#039;&amp;#039;&amp;#039;on-demand thumbnail generation confirmed working&amp;#039;&amp;#039;&amp;#039; (GD-based, since &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$wgUseImageMagick = false&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== What&amp;#039;s deliberately dropped/changed vs. the old site ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;HTML5video&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — dropped from the migration itself (not ported, since it&amp;#039;s PHP8-incompatible and functionally superseded by &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;TimedMediaHandler&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; for *uploaded* video files). This left every pre-existing YouTube embed on the wiki broken (the tag simply doesn&amp;#039;t exist anymore), since &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;HTML5video&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; was actually being used for embedding external YouTube videos, not self-hosted file uploads — a distinct use case &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;TimedMediaHandler&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; doesn&amp;#039;t cover. &amp;#039;&amp;#039;&amp;#039;Fixed 2026-07-25&amp;#039;&amp;#039;&amp;#039;, see Section 8 below — this line in earlier versions of this doc said &amp;quot;dropped, superseded by TimedMediaHandler,&amp;quot; which undersold the actual user-facing impact and is superseded by that section.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;UserAdmin&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — dropped (abandoned upstream, no PHP8-compatible fork). Equivalent functionality now lives in core &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;Special:UserRights&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;Special:Block&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;Special:PasswordReset&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;Special:CreateAccount&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. &amp;#039;&amp;#039;&amp;#039;Flag this at handover&amp;#039;&amp;#039;&amp;#039; — anyone who goes looking for the old UserAdmin panel URL needs to know it&amp;#039;s gone and why.&lt;br /&gt;
* TLS is now enforced (old site was HTTP-only) — Let&amp;#039;s Encrypt, auto-renewing.&lt;br /&gt;
* DB access is now a scoped &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wikiuser&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; account, not &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;root&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; like the old box.&lt;br /&gt;
&lt;br /&gt;
=== Not yet done ===&lt;br /&gt;
&lt;br /&gt;
* Old &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; box (now at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki-old.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, 172.105.56.64) decommission — DNS cutover is done (Section 9), but the box itself hasn&amp;#039;t been shut down/reclaimed yet; still a distinct later decision pending client go-ahead, same gating pattern as every other destructive step in this engagement.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Outbound email is confirmed broken&amp;#039;&amp;#039;&amp;#039; on &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki-new&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — MediaWiki has &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$wgEnableEmail&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$wgEnableUserEmail&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; on and a sender address configured, but no MTA is installed at all (no &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;sendmail&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, no Postfix, nothing on port 25; PHP&amp;#039;s &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;sendmail_path&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; points at a binary that doesn&amp;#039;t exist). Password resets, &amp;quot;email this user,&amp;quot; and watchlist notifications all silently fail right now. &amp;#039;&amp;#039;&amp;#039;Client explicitly deferred this&amp;#039;&amp;#039;&amp;#039; (2026-07-25) — parked until they&amp;#039;re ready to take it up. Open question when they do: route through Tetra&amp;#039;s existing relay servers (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;server-relay1/2/3.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, used for every other Tetra-hosted mail flow in this fleet) vs. a local Postfix — leaning relay for SPF/deliverability consistency, but needs a decision.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;TimedMediaHandler&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; needs &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;ffmpeg&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; for video transcoding if video *uploads* are actually used — not installed yet, wasn&amp;#039;t blocking for the text/image content that makes up this wiki, can add if needed. (Separate from the YouTube-embed fix in Section 8, which doesn&amp;#039;t touch file uploads.)&lt;br /&gt;
* Cosmetic: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wgLogo&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; points at a placeholder path; the old site&amp;#039;s custom logo (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;tetralogo.jpg&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; from the old &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;skins/common/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) could be restored if wanted.&lt;br /&gt;
* Rocky 9 kernel was bumped during initial setup (5.14.0-687.17 → .29) — a reboot is needed at some point to actually run the current kernel; not done yet since this was a live build in progress.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Production URL: https://wiki.tetrain.com/&amp;#039;&amp;#039;&amp;#039; (live since 2026-07-25). Test/staging alias &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://wiki-new.tetrain.com/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; still resolves to the same box and still works — both hostnames are on the same Apache vhost and TLS cert now (Section 9).&lt;br /&gt;
&lt;br /&gt;
== 7. Post-handover fix: logo sizing (2026-07-24) ==&lt;br /&gt;
&lt;br /&gt;
Client reported the logo looked wrong on the test site. Root cause was two separate things:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$wgDefaultSkin = &amp;quot;vector&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; was selecting &amp;#039;&amp;#039;&amp;#039;legacy&amp;#039;&amp;#039;&amp;#039; Vector (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;SkinVectorLegacy&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;), not modern Vector 2022 (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;vector-2022&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;SkinVector22&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) — MediaWiki 1.43&amp;#039;s actual intended default. Legacy Vector uses an old fixed &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;.mw-wiki-logo&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; single-image class; Vector 2022 uses a proper icon+wordmark structure. Fixed: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$wgDefaultSkin = &amp;quot;vector-2022&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Whatever logo was configured (client had already changed &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$wgLogo&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; to point at the real tetrain.com company logo, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;tetra_logo_2017Web.png&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, 198×399px — tall/narrow, not the old &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;tetralogo.jpg&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; from the original site) was being forced into Vector 2022&amp;#039;s fixed 50×50px square icon slot via hardcoded &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;width&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;height&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; HTML attributes, stretching/distorting it. Fixed: downloaded the logo, hosted it locally (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;/var/www/wiki/resources/assets/logo/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, avoiding a fragile cross-site hotlink to www.tetrain.com), and re-composited it onto properly-sized transparent square canvases (50/75/100px for 1x/1.5x/2x) with the logo letterboxed/centered at its correct aspect ratio rather than stretched. Configured via the modern &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$wgLogos&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; array (replacing the legacy single-string &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$wgLogo&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Verified: served logo image is now genuinely 50×50px matching the skin&amp;#039;s fixed slot exactly, no distortion. Cache cleared, confirmed live.&lt;br /&gt;
&lt;br /&gt;
== 8. Post-handover: YouTube video embed restoration (2026-07-25) ==&lt;br /&gt;
&lt;br /&gt;
Discovered as part of the separate &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;Wiki Pages Cleaning&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; project&amp;#039;s content audit: dropping &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;HTML5video&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; during the migration (Section 6) broke every pre-existing YouTube embed on the wiki — 149 embeds across 44 pages, all internal KT/training recordings and client-architecture walkthroughs. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;TimedMediaHandler&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; doesn&amp;#039;t cover this use case (it&amp;#039;s for self-hosted uploaded video files, not embedding external YouTube links), so this wasn&amp;#039;t actually fixed by the original migration decision.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Platform fix&amp;#039;&amp;#039;&amp;#039;: installed the third-party &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;EmbedVideo&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; extension (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;StarCitizenTools/mediawiki-extensions-EmbedVideo&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — not Wikimedia/Gerrit-hosted, no &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;REL1_43&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; branch, cloned default branch, confirmed &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;extension.json&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; supports MediaWiki ≥1.29.0). Patched a MediaWiki-1.43-incompatibility in &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;EmbedVideo.hooks.php&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (core &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;ParserOutput::addModules()&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;addModuleStyles()&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; now require strict &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;array&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; typing; EmbedVideo was passing bare strings) — two one-line fixes, verified via a scratch test page with &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$wgShowExceptionDetails&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; temporarily enabled, reverted after. Loaded via &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wfLoadExtension(&amp;#039;EmbedVideo&amp;#039;)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;LocalSettings.php&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. New embed syntax: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#ev:youtube|VIDEO_ID|640}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, replacing the dead &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;HTML5video&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Content fix&amp;#039;&amp;#039;&amp;#039;: for every one of the 149 embeds, retrieved the video&amp;#039;s actual YouTube transcript (via browser automation — auto-captions, not audio playback) and wrote an accurate summary paragraph published directly under each embed on its wiki page. Quality varies with source audio: most got full detailed summaries; ~25 are explicitly flagged &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[VERY POOR TRANSCRIPT QUALITY]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[PARTIAL TRANSCRIPT]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; where ASR/audio quality only allowed a partial or topic-level summary — flagged rather than guessed. 5 videos are outright inaccessible and flagged as such: 1 private, 4 removed by YouTube (3 for harassment/bullying policy, 1 general ToS violation — all 4 removals landed on the same &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;Training_2022_Linux_team&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; page, worth raising with whoever owns that YouTube account since repeated strikes risk the account itself). 2 duplicate-content pairs identified and cross-referenced instead of re-summarized. All findings are written directly into the paragraphs published on the wiki, so they&amp;#039;re visible to anyone reading the page, not just in this doc.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Publish mechanism&amp;#039;&amp;#039;&amp;#039;: pulled current wikitext per page via &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;php maintenance/run.php getText.php &amp;quot;&amp;lt;title&amp;gt;&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, replaced each &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;HTML5video&amp;gt;...&amp;lt;/HTML5video&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; tag with the &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#ev:...}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; embed plus a &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;Video summary:&amp;#039;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; paragraph, applied via &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;php maintenance/run.php edit.php -u Admin -b --nocreate &amp;quot;&amp;lt;title&amp;gt;&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (stdin). Note: most of these 44 &amp;quot;pages&amp;quot; are actually &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;Category:&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;-namespace pages being used to hold real content (a pre-existing wiki quirk, not introduced by this work) — titles needed the correct namespace prefix (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;Category:&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;Help:&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; for one outlier, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;Editing&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) to resolve correctly; a plain-namespace title lookup silently reports &amp;quot;page does not exist&amp;quot; otherwise.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Verified&amp;#039;&amp;#039;&amp;#039;: DB sweep confirms zero leftover &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;HTML5video&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; tags across all 44 pages; spot-checked in-browser that embeds render as real &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;iframe&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; elements (not just wikitext), including the largest page (50 videos, first/last IDs both confirmed rendering correctly).&lt;br /&gt;
&lt;br /&gt;
== 9. Post-handover: production DNS cutover (2026-07-25) ==&lt;br /&gt;
&lt;br /&gt;
Client updated DNS directly (no registrar/API access was available in this environment to do it here): &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; A record repointed from the old CentOS 7 box (172.105.56.64) to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki-new.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (172.105.39.56), and a new &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki-old.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; A record created pointing at the old box so it stays reachable post-cutover.&lt;br /&gt;
&lt;br /&gt;
DNS alone wasn&amp;#039;t sufficient — two things on the server side would have made the real domain look broken to visitors even with DNS correct, both found and fixed same-day:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;TLS certificate didn&amp;#039;t cover the real domain.&amp;#039;&amp;#039;&amp;#039; The existing Let&amp;#039;s Encrypt cert (Section 5) only had &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki-new.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; in its SAN list; hitting &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://wiki.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; fell through to Apache&amp;#039;s default self-signed cert (browser security warning). Expanded the same cert lineage via &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;certbot --apache -d wiki-new.tetrain.com -d wiki.tetrain.com --expand&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Certbot issued the expanded cert but couldn&amp;#039;t auto-install it into the vhost (ambiguous vhost match, no &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;ServerAlias&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; declared) — fixed manually by adding &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;ServerAlias wiki.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; to both the port-80 and port-443 vhost blocks (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;/etc/httpd/conf.d/wiki.conf&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki-le-ssl.conf&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, both backed up before editing) and broadening the HTTP→HTTPS &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;RewriteCond&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; to match either hostname.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$wgServer&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; still pointed at the old hostname.&amp;#039;&amp;#039;&amp;#039; MediaWiki would have kept generating every internal link, canonical URL, and redirect against &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki-new.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; even with the correct cert and DNS in place. Updated &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$wgServer&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://wiki.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;LocalSettings.php&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (backed up first).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Verified end-to-end&amp;#039;&amp;#039;&amp;#039;: valid cert presented for both hostnames (confirmed via SNI-specific TLS handshake against each), &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; redirect works for both, full redirect chain to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;Main_Page&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;200 OK&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, and a video-embed page (Section 8) renders correctly — iframe present — when loaded via &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://wiki.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;wiki-old.tetrain.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; resolves to and serves the old box.&lt;br /&gt;
&lt;br /&gt;
Outbound email was checked as part of this same pass and found broken (see &amp;quot;Not yet done&amp;quot; above) — client explicitly deferred fixing it.&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure Documentation]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>