4 · Decisions to make before anything is copied
Fourteen items, each with an owner, ordered by how hard they block the work. Three are blockers that people must settle before engineers start. This is the authoritative list of decisions; sections 2, 3 and 5 do not repeat it. Owners are: Benin IT, the receiving team; UNCTAD operations, who run the source machines today; and the investigation owner, who controls the S4 quarantine.
Blocker 1
S4 is under an incident quarantine — nothing leaves it, and nothing changes on it, until the investigators agree
Owner: investigation owner
FoundS4 is isolated by an incident firewall on server id 3406120; the full account is in the notice at the top of this page. Nothing leaves the host and nothing changes on it until the investigators agree.
DoObtain written clearance, the agreed export list and a transfer window from the investigation owner. Name a contact now: this gates every other S4 item on this page. Any transfer then needs either a temporary single-purpose firewall rule — opened, used, removed and re-verified against the quarantine — or offline media they have inspected. When the transfer is authorised, extract data, not disk images, so they can review exactly what left. UNCTAD operations prepares the export list; Benin IT countersigns it.
Blocker 2
S4 also holds Cameroon's production data — a whole-machine clone would hand it to Benin
Owner: UNCTAD operations + Benin IT
FoundPlesk manages 11 domains on the one box: seven are Benin's, four are not — 7 + 4 = 11, the whole box. MariaDB likewise holds Benin's schemas alongside others, and /mnt/volume-bj holds only Benin directories (718 GB production, 7.4 GB test).
The split, in fullThe two lists are set out here so the count can be checked without reading prose.
Benin's — seven
archive.monentreprise.bj | in |
benin.eregistrations.org | in |
chat.archive.monentreprise.bj | in |
dev.benin.eregistrations.org | in |
old-benin.eregistrations.org | in |
stats.archive.monentreprise.bj | in |
test.benin.eregistrations.org | in |
Not Benin's — four, the exclusion list
cameroun.eregistrations.org | out |
cameroun-test.eregistrations.org | out |
eregistrations.org | out |
mybusiness.cm | out |
DoOnce the investigators have cleared the host, and not before: extract only the Benin items — the Plesk subscriptions for archive.monentreprise.bj and benin.eregistrations.org — and, if the counterpart wants them, the other five Benin names listed above — a fresh logical dump of ereg_benin_prod plus whichever of the dev, test and migration schemas are wanted, and the two Benin directories under /mnt/volume-bj. Both sides sign the four-entry exclusion list before that cleared copy starts — and, as with everything on this machine, only once the investigators have cleared it.
Blocker 3
The public portal is not on the V4 machine, and nobody has confirmed who operates it
Owner: UNCTAD operations, then Benin IT
Foundmonentreprise.bj and www.monentreprise.bj resolve to 37.27.8.11, a separate Next.js host outside the Hetzner project reachable with the available API tokens. Nine service subdomains resolve to the V4 server; the citizen-facing apex does not.
DoIdentify the operator of 37.27.8.11, obtain its specification and its content, and settle whether it moves with this handover. A migration that copies only the platform server leaves the page most citizens see behind.
High
Neither system survives losing its machine today — and on V4 the offsite mirror has been failing nightly
Owner: UNCTAD operations
FoundOn V4 the MinIO mirror fails nightly because the minio-manager service is stopped, the PostgreSQL backup log is 0 bytes, and the only working copy — a mongodump — lands on the same volume as the live data. On S4 the nightly dump is written to the archive's own root disk with no offsite copy.
DoOn V4: restart minio-manager, prove one complete mirror run, and fix retention so archives survive the night. Take one verified offsite backup of V4 before the migration starts, not after. On S4, the equivalent work waits for clearance (blocker 1).
High
Two production passwords sit in plain text in automation on the two hosts
Owner: UNCTAD operations
FoundOne in the V4 maintenance.sh (MongoDB), one in the S4 root crontab (the archive database, also visible in ps while mysqldump runs). Neither value is reproduced anywhere in this document; only their locations are recorded.
DoRotate the V4 credential now, so the rebuilt system is built with the new value. Rotate the S4 credential once the investigators clear the host — changing anything on a quarantined machine is their call, not ours.
High
Both machines run ageing or end-of-life operating systems — rebuild on a supported OS instead of imaging the disk
Owner: Benin IT with UNCTAD operations
FoundS4 runs Ubuntu 18.04.6, out of standard support since April 2023, on a machine built in 2019. V4 runs Ubuntu 22.04.5, supported but carrying two years of undocumented local change.
DoAgree now that the target is a rebuild on a current Ubuntu LTS with data restored into it, not a disk image. One check gates the S4 target release, and it waits for clearance because it reads the source host: which PHP version the archive vhost uses — four are installed and the command-line default is 8.0.5. That check reads the source host, so it waits for clearance like everything else on S4. If the vhost needs 7.2 or 7.3, a current release may not offer it.
High
The V4 databases run directly on the host, not in containers — that changes how the copy is done
Owner: UNCTAD operations
FoundPostgreSQL 16.15, MongoDB 6.0.29 and Redis 6.0.16 are installed on the operating system, with /var/lib/postgresql and /var/lib/mongodb symlinked onto the big volume. Docker's own named volumes total 211.6 MB; the 777 GB of application data is bind-mounted from /opt/volumes.
DoInstall the databases natively on the target and restore with their own tools, or copy the directories cold with the services stopped. A copy driven by docker volume would move 211.6 MB and leave 777 GB behind.
High
S4's root disk is 93% full, which constrains how the extraction can be staged
Owner: investigation owner, then UNCTAD operations
Found226 GB total, 200 GB used, 18 GB free, no swap. The 8 GB that does not add up is ext4 reserved space, and the 93% is measured against the usable part rather than the raw 226 GB. The obvious space to reclaim is the 39 GB of retained nightly dumps — but it sits on the quarantined host.
DoOnce the investigators clear it, move those dumps to the backup target and re-measure. Until then the planning can be done on paper, and nothing at all is written on the host. When the extraction is authorised, stage nothing on /: /mnt/volume-bj has 209 GB free as measured by df, which a full ~790 GB extract does not fit into either, so streaming straight off the host over the approved channel is the primary option and any staging there can only be partial.
Medium
Clean up the V4 data before sizing the disk — it is the difference between an 8 TB and a 4 TB purchase
Owner: UNCTAD operations, decision by Benin IT
FoundAbout 1.4 TB of the 2.1 TB footprint is Camunda process history, OpenSearch log indices, stale SQL dumps and an oversized ActiveMQ store. Section 2 sets this out in full.
DoRun Camunda history cleanup on the source, agree an OpenSearch and Graylog retention policy, confirm and delete the three stale dumps, and investigate the ActiveMQ backlog. Then re-measure, and order the disk from the new figure. The 8 TB recommendation assumes none of this happens.
Medium
V4 is under memory pressure today — do not size the new hardware below the old, and raise the mule limit
Owner: UNCTAD operations
Found13 to 14 GiB of swap in use on a 128 GB machine, and four mule containers — the integration service, glossed in section 2 — pinned at their 4 GiB ceiling with repeated exit-137 kills.
DoSpecify 256 GB on the new host. Separately, raise the container limit — 6 GiB is a reasonable first step — then observe the new steady state and set the final value from it. This is a configuration change on the current machine, not a purchase.
Medium
Network controls, the site link and external dependencies have to be rebuilt deliberately on-premises
Owner: Benin IT
FoundOn V4 the host firewall is the only packet filter, and management ports are open only to named external addresses. The platform also calls four external services: translations.eregistrations.org, warmer.eregistrations.org, benin.eregistrations.org and archive.monentreprise.bj.
DoRebuild the allow-lists from section 6 on day one, confirm each external dependency is still required and reachable from the new site, and procure the site internet link early: at least 1 Gbit/s symmetric, per section 2. Bandwidth takes longer to obtain than servers.
Medium
Agree what on the S4 machine is in scope, and leave the rest behind
Owner: Benin IT decides, UNCTAD operations lists
FoundBesides the archive, the box runs mail, FTP, bind DNS, Grafana, an Ollama model server and five Docker containers, and the subscription home holds build tooling and working directories the archive application does not require: .cargo, .bun, bison-3.8.2, check_trade_name, ASIN-REQUEST.
DoDraw up an explicit in-scope list and have the counterpart confirm what is wanted. Anything not on it is excluded from the copy. No judgement is implied about how the machine has been run; this is only about what the new one needs to carry.
Medium
TLS and DNS cutover needs its own plan, with a certificate that renews without Hetzner
Owner: Benin IT with UNCTAD operations
FoundThe V4 wildcard certificate for *.monentreprise.bj expires 2026-12-07 and is renewed by certbot using DNS-01 with the Cloudflare plugin, read by HAProxy. The monentreprise.bj zone is delegated to Hetzner DNS.
DoMove the renewal automation to the new host, rotate the Cloudflare API credentials at handover, and prove one successful renewal on the new machine before any DNS record is switched.
Medium
Settle who owns the cloud account holding the S4 source server, and who decommissions it
Owner: UNCTAD operations with Benin IT
FoundThe archive server sits in a Hetzner Cloud project separate from Benin's, so account access and billing are not where the rest of the estate is.
DoAgree in writing who pays for and controls that account during the migration, how long the source stays running after Benin accepts the rebuilt archive, and who decommissions it — which cannot happen until the investigation releases the host.