---
type: system
name: ix-server
display_name: IX Web Hosting Server
last_compiled: 2026-06-05
compiled_by: GURU-5070/claude-main
sources:
  - live SSH inventory 2026-06-05 (root@172.16.3.10, key auth from GURU-5070)
  - .claude/memory/reference_radio_website.md
  - .claude/memory/reference_ix_server_access.md
  - wiki/clients/internal-infrastructure.md
  - projects/radio-show/website/ (source tree)
---

# IX Web Hosting Server

`ix.azcomputerguru.com` — Arizona Computer Guru's cPanel/WHM shared-hosting box.
It hosts ACG's own static sites (incl. **radio.azcomputerguru.com**), the Flarum
community forum, Matomo analytics, and ~72 client cPanel accounts (185 domains,
101 WordPress installs).

> Operational history (account cleanups, WordPress hygiene, mail routing, the
> Cox→Cloudflare BGP workaround) lives in
> [`wiki/clients/internal-infrastructure.md`](../clients/internal-infrastructure.md).
> **This article is the systems-level inventory** — what the box is, what runs on
> it, and where each hosted thing lives. Last verified by live SSH 2026-06-05.

## Host facts

| Item | Value |
|---|---|
| Hostname | `ix.azcomputerguru.com` |
| Internal IP | `172.16.3.10` (also `172.16.1.39`); Tailscale or office LAN required |
| External IP | `72.194.62.5` (SSH `:22` firewalled from WAN — internal only) |
| OS | CloudLinux 9.7 (Pavel Popovich), kernel `5.14.0 ...tuxcare.els` (TuxCare ELS) |
| CPU / RAM | 64× Intel Xeon Gold 6130 @ 2.10 GHz / 62 GiB |
| Disk | `/` 70 G (xfs, 50% used); **`/home` 4.4 T (xfs, 1.6 T used, 35%)**; `/boot` + EFI on `sdb` |
| Control panel | cPanel/WHM **134.0 (build 35)** |
| Web | Apache **2.4.67** (cPanel EA4) |
| DB | MariaDB **10.11.16** (per-account MySQL) |
| PHP | ea-php **5.6 → 8.5** installed; default CLI **8.1.34** |
| Mail | Exim **4.99.4**, Dovecot **2.4.2** |
| DNS | BIND **9.16** (104 local zones) |
| WHM / cPanel UI | `https://ix.azcomputerguru.com:2087` (WHM) · `:2083` (cPanel) · `:2096` (webmail) — **must stay grey-cloud / DNS-only** in Cloudflare (non-standard ports can't traverse the tunnel) |

### Access

| From | How |
|---|---|
| **GURU-5070** | `ssh root@172.16.3.10` — **SSH key auth works** (verified 2026-06-05). System OpenSSH, internal IP, Tailscale up. |
| Scripts to `gurushow` paths | paramiko `look_for_keys=False, allow_agent=False` (account-level key auth disabled) |
| Password fallback | Vault `infrastructure/ix-server.sops.yaml` (root password) |
| WHM API | `whmapi1 <fn>` over SSH (e.g. `whmapi1 listaccts`) |
| RMM | `gururmm-agent.service` is enrolled and running — drive via `/rmm` when SSH isn't handy |

### WHM / cPanel API access

Programmatic WHM/cPanel API access to `ix.azcomputerguru.com:2087` uses the **full-access
root WHM API token "ClaudeTools"**, stored at vault `infrastructure/ix-server` field
`credentials.whm-api-token`. Authenticate with header `Authorization: whm root:<token>`
and force IPv4 (`curl -4`).

- **Password basic-auth on the legacy `/json-api/` now returns 403 pre-auth** — do NOT use
  the root password for API calls. (The password remains valid for SSH / console only;
  vault `infrastructure/ix-server.sops.yaml`.)
- The box is gated by **Imunify360** (cPHulk is disabled). If API calls fail with 403 +
  HTTP 000 / connection-reset symptoms, check the Imunify allow-list. Our egress IPs were
  whitelisted 2026-06-12: IPv4 `98.97.118.217`, IPv6 `2605:59c0:43a6:9710::/64`.

### DNS (BIND) notes

- Public nameservers for IX-hosted zones are `ns1`/`ns2.acghosting.com` (`52.52.94.202`);
  the cluster auto-syncs zone edits.
- **2026-06-12** — the `jparkinsonaz.com` zone (hosted here) was cleaned to an **O365-only**
  record set during Jim Parkinson's mail migration: removed the root A (was Neptune
  `67.206.163.124`), the `mail` CNAME, all CalDAV/CardDAV SRV records, and cPanel DCV/ACME
  records; left M365 MX / SPF / autodiscover / DKIM only. See [[clients/lamaddux]].

### Edge / routing

Cloudflare tunnel **`acg-origin`** (UUID `78d3e58f-1979-4f0e-a28b-98d6b3c3d867`,
`cloudflared` container on Jupiter) fronts the ACG hostnames → IX `:443`.
`ix.azcomputerguru.com` itself is grey-cloud (direct to `72.194.62.5`) so WHM/cPanel
ports route. This tunnel is the workaround for the Cox BGP→Cloudflare routing break
(see internal-infrastructure.md).

### GuruRMM agent

- Service: `gururmm-agent.service` (active/running), binary `/usr/local/bin/gururmm-agent`
- Config: `/etc/gururmm/agent.toml` (root-only, 0600)
- Means IX is reachable through the GuruRMM fleet as well as SSH.

### Backups — gap to watch

`/backup` exists but is only **~178 M** against a 1.6 T `/home`, and no WHM remote
backup-transport destinations are configured. cPanel account backups do **not**
appear to be comprehensively enabled/offloaded. [WARNING] Treat IX as **not
currently backed up** until verified — flag before any risky account/site work.

---

## ACG-owned sites on IX

The **`azcomputerguru`** cPanel account (`/home/azcomputerguru/public_html/`) hosts
ACG's own sites as subdirectories. `gurushow` and `acg` are separate accounts.

| Hostname | Stack | Document root |
|---|---|---|
| **radio.azcomputerguru.com** | Astro static + React 19 islands | `.../public_html/radio` |
| azcomputerguru.com | Astro static (public site) | `.../public_html` |
| community.azcomputerguru.com | Flarum forum | `.../public_html/community/public` |
| analytics.azcomputerguru.com | Matomo | `.../public_html/analytics` |
| portal / clientportal / clients / support / express / rdb / logos / adlice / khalsaportal .azcomputerguru.com | misc apps/portals | `.../public_html/<name>` |
| phoenixmanagedservices.com (+ subdomain) | site | `.../public_html/phoenixmanagedservices.com` |
| gurushow.com | radio show brand site | account `gurushow` → `/home/gurushow/public_html` |
| (radio audio archive) | static MP3 archive | account `gurushow` → `/home/gurushow/public_html/archive/Radio/` |
| acghosting.com | hosting brand | account `acg` |

(`*.cprapid.com` auto-domains are cPanel temporary URLs — ignore.)

### radio.azcomputerguru.com — "The Computer Guru Show" website

Public site for the radio show. **Built by Claude; source in the ClaudeTools repo**
(`projects/radio-show/website/`) — the server holds only the built `dist/`. Live
build confirmed 2026-06-05 (`<html data-theme="dark">`, dark-mode via localStorage;
last deploy ~Mar 2026).

| Item | Value |
|---|---|
| URL | https://radio.azcomputerguru.com |
| Source | `projects/radio-show/website/` (ClaudeTools repo) |
| Framework | Astro `^6.0.4`, `output: 'static'` |
| Islands / libs | `@astrojs/react` (React 19), MDX, sitemap, RSS; `wavesurfer.js` (episode audio), `fuse.js` (client search) |
| Node | `>= 22.12.0` |
| Content | MD/MDX collections `src/content/episodes/`, `src/content/blog/` |
| Pages | index, about, community, contact, live, subscribe, episodes/, blog/, feed.xml (RSS), 404 |
| Layout | `src/layouts/BaseLayout.astro`; components under `src/components/{global,home,episodes}/` |
| Analytics | Matomo site ID 3 — tracker injected into built HTML before `</head>` |

**Build & deploy** (pure static — no server runtime):
```bash
cd projects/radio-show/website
npm install            # first time (node >= 22.12.0)
npm run build          # -> dist/
rsync -az --delete dist/ root@172.16.3.10:/home/azcomputerguru/public_html/radio/
```

It is tier 1/3 of the post-show content workflow in
[`wiki/projects/radio-show.md`](../projects/radio-show.md) (episode pages + blog
posts generated per episode). The audio pipeline / archive DB / FastAPI UI are
separate from this static site.

**human-flow note:** the AST scanner can analyze the `.tsx` island components under
`src/components`; it skips `.astro` page templates (those need a manual/heuristic pass).

---

## Client cPanel accounts (72 accounts, 185 domains)

The "where does client X's website live" map — primary domain per account, sorted by
disk. Account home is `/home/<account>/`, web root `/home/<account>/public_html/`.
**101 WordPress installs** across these accounts.

| Disk | Account | Primary domain |
|---|---|---|
| 85 G | westernt | westerntire.com |
| 38 G | azcomputerguru | azcomputerguru.com (ACG — see above) |
| 27 G | grabblaw | grabblaw.com |
| 25 G | voicesofthewest | voicesofthewest.net |
| 18 G | computergurume | computerguru.me |
| 8.7 G | acg | acghosting.com (ACG) |
| 8.7 G | gurushow | gurushow.com (ACG — radio archive) |
| 8.0 G | sparcora | sparcoracing.com |
| 7.6 G | azrestaurant | azrestaurantsupply.com |
| 7.0 G | acepickupparts | acepickupparts.com |
| 6.7 G | perkins | classicsingleaction.com |
| 6.1 G | danaise | danaise.com |
| 5.3 G | sandtekomachine | sandtekomachinery.com |
| 4.4 G | remotesystems | remotesystems.us |
| 4.3 G | thegirlsestate | thegirlsestatesales.com |
| 3.0 G | upracing | upracing.com |
| 2.8 G | farwest | farwestwell.com |
| 2.6 G | tucsonadobe | tucsonadobe.com |
| 2.5 G | hightechmortgage | hightechmortgage.com |
| 2.1 G | bruceext | bruceexterminating.com |
| 2.0 G | outaboundssports | outaboundssports.com |
| 1.9 G | jrkco | jrkco.com |
| 1.9 G | compoundfitness | compoundfunctionalfitness.com |
| 1.7 G | ezfastautoglass | ezfastautoglass.com |
| 1.5 G | rednourlaw | rednourlaw.com |
| 1.4 G | johnmartell | martellappraisals.com |
| 1.4 G | peacefulspirit | bestmassageintucson.com |
| 1.1 G | rrspc | rrspc.com (active local mail, MX to mail.rrspc.com) |
| 1.1 G | nwpool | northwestpoolcare.com |
| 898 M | azwebdesign | arizonawebsitedesign.pro |
| 835 M | berman | agingwithoutfamily.org |
| 819 M | arizonahatters | arizonahatters.com |
| 805 M | tucsongc | tucsongoldencorral.com |
| 795 M | pcatucson | pcatucson.com |
| 774 M | themarcgroup | themarcgroup.com |
| 722 M | fsgtucson | fsgtucson.com |
| 680 M | antivaxxer | anti-vaxxer.org |
| 635 M | desertfox | tucsonpaintball.net |
| 604 M | tarafulcreations | tarafulcreations.com |
| 583 M | phxpropane | phxpropane.com |
| 568 M | gentlemansacres | gentlemansacres.com |
| 518 M | rarengineer | rarengineer.com (MX may resolve to IX) |
| 492 M | ucryo | ucryo.com |
| 479 M | packetdial | packetdial.com |
| 358 M | royalweedcontrol | royalweedcontrol.net |
| 356 M | drsticken | drsticken.com |
| 345 M | photonicapps | photonicapps.com |
| 340 M | thrive | thriveappraisalservices.com |
| 325 M | cryoweave | cryoweave.com |
| 299 M | atlantisbevco | atlantisbevcollc.com |
| 267 M | zammit | valleydevelopmentcorp.com |
| 258 M | blackswanarchery | blackswanarchery.com |
| 242 M | lifelong | lifelonglearningacademy.com |
| 239 M | thecentu | thecenturions.com |
| 151 M | ultraper | ultraperformance.com |
| 80 M | goldench | goldenchoicecatering.com |
| 78 M | cascades | cascadestucson.com |
| 67 M | jefffurr | jefffurrier.com |
| 37 M | lamaddux | lamaddux.com |
| 34 M | martylryan | martylryan.com |
| 33 M | hoopevents | hoopevents.news |
| 27 M | grygutis | barbaragrygutis.com |
| 25 M | bardach | bardach.net |
| 24 M | wolkin | rswolkin.com |
| 20 M | devconllc | devconllc.com |
| 19 M | horseshoemgt | horseshoemgt.com |
| 16 M | starrpass | starrpass.com |
| 16 M | jparkinsonaz | jparkinsonaz.com |
| 16 M | heieck | heieck.org |
| 8 M | jackfurr | jackfurrier.com |
| 8 M | glaztech | glaztech.com |
| 3 M | drelenaparra | drelenaparra.com |

> Several of these map to ACG managed-service clients — e.g. `cryoweave`
> (CryoWeave), `rednourlaw` (Rednour Law), `peacefulspirit` (Peaceful Spirit),
> `grabblaw` (Grabb & Durando), `ucryo` (Universal Cryogenics), `horseshoemgt`
> (Horseshoe Mgmt), `glaztech` (Glaz-Tech), `westernt`/`jackfurr`/`jefffurr`
> (Furrier / Western Tire). 185 total domains include addon/parked/subdomains.

To regenerate this inventory: `ssh root@172.16.3.10` then `whmapi1 listaccts` (full
account data), `/etc/trueuserdomains` (primary domain → account), `/etc/userdomains`
(all domains → account), `/var/cpanel/userdata/<account>/<domain>` (per-domain docroot).

---

## Backlinks

- [`wiki/clients/internal-infrastructure.md`](../clients/internal-infrastructure.md) — IX operational record (cPanel/WordPress hygiene, mail, Cox/Cloudflare tunnel)
- [`wiki/projects/radio-show.md`](../projects/radio-show.md) — radio show project (audio pipeline + post-show workflow)
- [`wiki/systems/jupiter.md`](jupiter.md) — runs the `cloudflared` tunnel container fronting IX
- [[clients/lamaddux]] — `lamaddux.com` + `jparkinsonaz.com` DNS zones hosted here (jparkinsonaz cleaned to O365-only 2026-06-12)
- Memory: `reference_radio_website.md`, `reference_ix_server_access.md`, `reference_resource_map.md`
