Home About Services Projects Blog Contact Hire me
Portfolio

Projects & engagements

Infrastructure work doesn't produce screenshots. So here's what these actually were: the problem, what I did, and what changed as a result.

Migration

PHP 5.6 → 8.2 platform migration

Led the move of a high-traffic AWS-hosted client onto Ubuntu 24.04, Apache 2.4 and MariaDB 10.11 with a ~176 GB database. Header-based ALB routing let the new stack serve real traffic for testing before anyone was cut over, backed by a full dump/restore sync and a Gitolite auto-deploy pipeline.

AWS ALBUbuntu 24.04MariaDB 10.11GitolitePHP 8.2

→ Seconds-level target-group rollback path

Performance

High-load triage on production nodes

Resolved sustained load events of 45–80 on 8–24 core production servers by attributing I/O and CPU with pidstat, iostat and sar rather than guessing. Causes traced to scanner bursts running under PHP-CGI without LVE caps, oversized IMAP maildirs holding Dovecot index locks, and EXT4 metadata corruption.

pidstatiostatsarCloudLinux LVEDovecot

→ Root-caused, not restarted

Data recovery

WooCommerce recovery after InnoDB corruption

A disk-full event corrupted InnoDB and forced a MariaDB rebuild on a DirectAdmin server. Recovered order, tax, attribute and shipping data across multiple stores by working from pre-rebuild data-directory snapshots.

InnoDBMariaDBDirectAdminWooCommerce

→ Live commerce data recovered, not written off

Incident

Rootkit-level compromise containment

Investigated and contained active compromises involving rogue systemd services, /etc/ld.so.preload hooks, hidden payload fetchers, webshells and crypto-mining processes. Forensic log analysis, cleanup and post-incident hardening across WordPress and Joomla environments.

Forensicsld.so.preloadsystemdWordPressJoomla

→ Contained, cleaned, hardened against repeat

Hardening

Repeat-incident reduction programme

Deployed ModSecurity vendor rulesets (OWASP and Comodo) wired to CSF auto-ban triggers, Fail2Ban watching non-standard SSH ports under firewalld, and KernelCare live patching — plus a firewall rule optimisation pass.

ModSecurityCSFFail2BanfirewalldKernelCare

→ Fewer repeat incidents across the estate

Migration

DigitalOcean → AWS EC2 moves

Executed cPanel-to-cPanel and cross-provider migrations onto AWS EC2, with post-migration validation sweeps — curl status checks across every domain, then path and permission fixes — before the old host was released.

AWS EC2cPanelDigitalOceancurl sweeps

→ Validated before handover, not after complaints

Mail & DNS

Delivery and authentication repair

Troubleshot delivery and authentication failures across Exim, Postfix and Dovecot — SPF, DKIM and DMARC records, spam filtering and blacklist delisting — alongside DNS record fixes, certificate renewal and manual AutoSSL recovery via acme.sh.

EximPostfixSPF / DKIM / DMARCRBL delistingacme.sh

→ Inbox placement and SSL restored

Monitoring

Multi-server monitoring coverage

Maintained Zabbix, Grafana and Nagios coverage across multi-server fleets, tuning alert thresholds so pages meant something, and running proactive health sweeps to catch disk and load problems before customers did.

ZabbixGrafanaNagiosAlert tuning

→ Problems caught before the ticket arrives

Academic

IoT plant-watering automation

Internship project at Exposys Data Labs: an Arduino-based irrigation system using soil-moisture sensors to regulate water levels automatically.

ArduinoIoTSensors

→ Built end to end during a one-month internship

Your turn

Want the detail behind any of these?

Happy to walk through the diagnosis on any of these — what the symptoms looked like, how it was attributed, and what the fix actually was.