WordPress Operations

WordPress Web Hosting Operations

Operational procedures for provisioning, maintaining, and migrating FFC WordPress hosting accounts.

FFC operates WordPress hosting for partner charities across two active hosts (Hostinger, InterServer) and two legacy hosts (HostPapa, older InterServer RS1 boxes). This page is the operations-team reference for provisioning, monitoring, migrating, and eventually retiring those accounts.

The charity-facing “why free hosting” pitch lives at freeforcharity.org/free-charity-web-hosting/ — keep that page for prospective charity applicants. This page is for the FFC admin actually running the hosting.

Active hosts

InterServer DirectAdmin (legacy)

Control panel: DirectAdmin

Origin IP pattern: 192.64.86.202 (shared)

The original FFC origin host. Most charity sites pre-2024 live here. Nonprofit deal is brokered through sales@interserver.net with a copy of the IRS 501(c)(3) letter. Account creation requires the "Powered by InterServer" footer link within 30 days.

InterServer RS1 (managed) (legacy)

Control panel: DirectAdmin

Origin IP pattern: 216.158.234.18

A handful of larger charity sites (e.g. legion-in-the-woods, technologymonastery) run on RS1 instead of the shared DA. Same nonprofit deal, same footer-link requirement.

Hostinger hPanel (current default)

Control panel: hPanel

Origin IP pattern: 153.92.213.212 (shared)

Default host for new FFC WordPress onboardings since 2024. Nonprofit pricing applied via the Hostinger nonprofit program; footer link is "Powered by Hostinger".

HostPapa (legacy)

Control panel: cPanel

Origin IP pattern: 204.44.192.77

Used for a small set of For-Profit + .com charity pairs. Not a default for new onboardings.

Operational procedures

Provisioning a new hosting account

  1. Confirm the charity has cleared the wordpress-charity-validation gate.
  2. Open a nonprofit account with the chosen host (Hostinger is current default) using the charity-domain mailbox.
  3. Email host nonprofit support with the IRS letter + the registered domain.
  4. FFC admin co-signs as tech sponsor.
  5. Once approved, install WordPress via Softaculous / hPanel one-click installer.
  6. Create the globaladmin@freeforcharity.org admin user on the new install.
  7. Verify SSL provisioning, set Cloudflare DNS, run a baseline Lighthouse, save the result in the intake record.

Monitoring an existing hosting account

  1. WPMUDEV Hub dashboard surfaces uptime + Defender alerts. Check weekly.
  2. Cloudflare zone analytics shows traffic anomalies (large 4xx spikes, sustained bot traffic).
  3. Snapshot Pro reports red runs in the Hub; investigate before they chain.
  4. For PHP version drift: hosts auto-upgrade minor versions; major upgrades (PHP 8.x → 8.y) require a manual smoke test on staging first.

Migrating between hosts

  1. Take a full backup on the source host (see wordpress-cpanel-backup-sop).
  2. Spin up an empty WordPress install on the target host.
  3. Restore the database + uploads onto the target install.
  4. Update wp-config.php with new database credentials.
  5. Run wp search-replace from the old hostname to the new (or the same hostname if just changing host IP).
  6. Swap Cloudflare A record to the new origin IP only after smoke-test passes on staging.
  7. Run Lighthouse on the new origin; investigate any > 10-point regression.
  8. Decommission the source account 7 days after the swap (long enough to catch propagation issues, short enough that the charity is not billed twice).

Migrating off WordPress entirely

  1. Run a Simply Static export per docs/ffc-simply-static-config.md.
  2. Convert the export into a Next.js / Tailwind site using the FFC_Single_Page_Template scaffold.
  3. Cut DNS to GitHub Pages (185.199.108-111.153) once the static site is verified.
  4. Keep the WordPress origin running for 30 days as a fallback (read-only).
  5. Decommission the WP hosting account after the 30-day soak.

Source of truth for per-charity mapping

The full list of FFC-managed charity domains, the host each lives on, and the migration status is at /sites-list — refreshed automatically from docs/SITES_LIST.md on every push to main.

Cross-references