Idealogic Production Cluster

This documentation covers the ArgoCD-managed Kubernetes deployments for the Idealogic Production cluster hosted at Xneelo in the Johannesburg data centre.

Cluster overview

Cluster ID

idl-xnl-jhb1-01

Location

Xneelo Johannesburg Data Centre

Management

Rancher

GitOps

ArgoCD with App-of-Apps pattern

Storage

Longhorn

Ingress

ingress-nginx packaged by RKE2, behind a kube-vip virtual IP (details)

The cluster is bootstrapped via the cluster-bootstrap.yml manifest, which deploys the root ArgoCD Application. This application monitors the argocd/ directory and automatically deploys all child applications defined there.

Why App-of-Apps?

This cluster uses the App-of-Apps pattern recommended by ArgoCD for cluster bootstrapping. Key benefits:

  • Declarative management - A single root application manages all child applications, enabling consistent deployment across the cluster

  • Automated operations - With automated sync and pruning, applications are created, updated, and removed automatically when manifests change in Git

  • Cascading deletion - Proper cleanup through finalizers ensures child applications and their resources are removed when the parent is deleted

  • Version control integration - All infrastructure changes follow standard Git workflows with code review before deployment

Bootstrapped applications

The following applications are deployed via ArgoCD from the argocd/ directory.

Infrastructure

Application Description Namespace Source

certificates

TLS certificate resources managed by cert-manager

Various

Git: certificates/

external-dns

Automatic DNS record management with Cloudflare

external-dns

Helm: external-dns v1.14.3

ssh-bastion

SSH tunnel access to internal cluster services (details)

bastion

Git: ssh-bastion/

storage

Longhorn storage class configurations

Various

Git: storage/

Database infrastructure

Application Description Namespace Source

mysql-operator

MySQL Operator for Kubernetes (Oracle)

mysql

Helm: mysql-operator v2.1.9

mysql-idealogic-prod

MySQL InnoDB Cluster for production workloads (details)

mysql

Git: mysql/idealogic-prod/

postgresql-prod

PostgreSQL database for Chatwoot and SonarQube

postgresql

Helm: bitnamicharts/postgresql v18.1.15

redis-prod

Redis cache in standalone mode

redis

Helm: bitnamicharts/redis v24.1.0

memcache-prod

Memcached for WordPress object caching

memcached

Helm: bitnamicharts/memcached v6.9.2

Applications

Application Description Namespace Source

wordpress-wpca-prod

WP Cycling production WordPress site (wpcycling.com)

wp-wpca-prod

Helm: bitnamicharts/wordpress v19.0.7

wordpress-wpca-test

WP Cycling test WordPress environment

wordpress

Helm: bitnamicharts/wordpress v19.0.7

wp-wpcycling

WP Cycling WordPress site, immutable Bedrock image on PHP 8.5 (christhonie/wp-wpcycling). Public site at https://www.wpcycling.com (canonical), with wpcycling.com and newweb.wpcycling.com as aliases that redirect to it; no basic auth. Replaced the legacy site on OPT-HTZ-CPT-02 in October 2026. Its own database wp_wpcycling (user wpcycling), not wpca_prod. Mail through the Google Workspace SMTP relay, which admits the cluster by source address: see Public Addresses and Their Dependents (AD-01) for what to update when cluster addresses change.

wordpress

Helm (OCI, private): christhonie/wp-wpcycling v0.1.0

jasper-reports

JasperReports Server for report generation

jasper-reports-prod

Helm: bitnamicharts/jasperreports v18.0.0

chatwoot-prod

Chatwoot customer engagement platform (chat.idealogic.co.za)

chatwoot

Helm: chatwoot v2.0.9

event-membership-stage

Event Membership application staging environment

event-membership-stage

Git: event-membership/ns-stage/

greenmail-dev / greenmail-stage

SMTP sink for the Event Membership non-production namespaces — no route off the cluster. See Mail Sink

event-dev / event-stage

Git: event-membership/greenmail-{dev,stage}/

snappymail-dev / snappymail-stage

Webmail onto GreenMail (event-mail-dev / event-mail-stage.idealogic.co.za)

event-dev / event-stage

Git: event-membership/snappymail-{dev,stage}/

idealogic-docs

Antora documentation site (docs.idealogic.co.za)

idealogic-docs

Git: doc-site/k8s/

Observability

Application Description Namespace Source

opentelemetry-collector

OpenTelemetry Collector for traces, metrics, and logs

observability

Helm: opentelemetry-collector v0.61.2

The OpenTelemetry Collector exports telemetry to:

  • Grafana Cloud - Traces (Tempo), metrics (Prometheus), and logs (Loki)

  • Elastic Cloud - APM traces, metrics, and logs

Application dependencies

The following diagram shows the key dependencies between applications:

wordpress-wpca-prod ──┬──> mysql-idealogic-prod (database)
                      └──> memcache-prod (object cache)

wordpress-wpca-test ────> mysql-idealogic-prod (database)

wp-wpcycling ─────────┬──> mysql-idealogic-prod (database wp_wpcycling)
                      └──> smtp-relay.gmail.com (outbound mail; admits 197.189.214.88/29, AD-01)

jasper-reports ─────────> mysql-idealogic-prod (database)

chatwoot-prod ──────┬──> postgresql-prod (database)
                    └──> redis-prod (cache/queues)

event-admin-service   ──┐
registration-portal   ──┼──> greenmail (SMTP, dev + stage only)
membership-ui         ──┘

registration-portal ────> redis-prod (register-session rate-limit counters, stage only)

snappymail ─────────────> greenmail (IMAP + SMTP)

Registration portal hostnames

The registration portal is multi-tenant: one deployment per environment serves every organisation, and each tenant is a hostname on that deployment’s ingress. A hostname only serves the portal once a tenant row in the portal’s gateway schema maps it to a registration system; without the row it returns 404.

Production

Hostname ArgoCD application Tenant

registration-v2.myriadevents.co.za

ems-registration-portal-prod

Default tenant (ingress hostname)

register.tourdeworcester.co.za

ems-registration-portal-prod

Tour de Worcester

wcsc-v2.myriadevents.co.za

ems-registration-portal-prod

Western Cape Schools Cycling (public participant list)

registration.wpcycling.com

ems-registration-portal-prod

WP Cycling. DNS is a CNAME to idl-xnl-jhb1-vip1.idealogic.co.za, held outside this repository.

registration.myriadevents.co.za

registration-portal-prod

Myriad Events (ingress hostname)

hnr.myriadevents.co.za

registration-portal-prod

Helderberg Nature Reserve

wcsc.myriadevents.co.za

registration-portal-prod

Western Cape Schools Cycling

hnr-vc.myriadevents.co.za

registration-portal-prod

HNR VC

Stage and dev

Hostname ArgoCD application Tenant

registration-portal-stage.idealogic.co.za

registration-portal-stage

Tour de Worcester (ingress hostname)

registration-stage.myriadevents.co.za

registration-portal-stage

Myriad Events

hnr-stage.myriadevents.co.za

registration-portal-stage

Helderberg Nature Reserve

wcsc-stage.myriadevents.co.za

registration-portal-stage

Western Cape Schools Cycling

hnr-vc-stage.myriadevents.co.za

registration-portal-stage

HNR VC

wpcycling-stage.myriadevents.co.za

registration-portal-stage

WP Cycling

registration-portal-dev.idealogic.co.za

registration-portal-dev

Dev (ingress hostname)

The stage database is refreshed from production every night. A stage tenant row survives that refresh, but a registration system created only on stage does not, so a stage-only tenant stops resolving until its registration system exists on production too.

Sync policies

Most applications use automated sync with:

  • prune: true - Remove resources deleted from Git

  • selfHeal: true - Revert manual changes to match Git state

  • CreateNamespace=true - Automatically create target namespaces

The event-membership-stage application has automated sync disabled (automated: null), requiring manual sync operations.

Additional resources