Alexander Gomanov Home Contact
RU EN

Cases

Cases: infrastructure, platform and service management

The 2-minute version for hiring managers. I work across four problem areas: scaling platforms, reducing infrastructure cost, improving production reliability and building operating models for infrastructure teams. The cases below are grouped along those axes — filter them to match your pain.

Two tracks within the ITG group. At SimpleOne — product infrastructure and platform: Kubernetes readiness, object storage, processes and capacity. At ITGLOBAL.COM — Managed Services: a team of 13 engineers (DevOps, SRE, Managed Apps, Linux/Windows, DBA).


SimpleOne · Head of Infrastructure

Infrastructure and platform at SimpleOne

The product is deployed as an HA cluster across 20+ servers (Docker Compose + Ansible) and shipped to customers on-prem. My cases here are about Kubernetes readiness, object storage, reproducible processes and deliberate capacity planning.

15microservice repositories in the Kubernetes-readiness audit
~8 TiBproduction data in the S3 migration plan (1.8M objects)
up to 180 GBobject-storage reduction potential
01Platform · Kubernetes

Kubernetes-readiness audit — 15 microservices

Context

The product is deployed as an HA cluster across 20+ servers via Docker Compose and Ansible; the strategic goal is a move to Kubernetes. The microservice codebase was built for Compose: networking through an external Docker network, DNS via the embedded resolver, database and broker configs defaulting to 127.0.0.1/localhost. In Kubernetes these assumptions silently break on deploy — I needed to understand what blocks the migration and estimate the scope of changes.

What I did
  • ran a static analysis of 15 repositories: Go services, a PHP monolith, HAProxy/Nginx configs, integration services
  • categorized findings by criticality: migration-critical (block startup) vs. low-priority (dev/CI/test)
  • found 12+ spots with hardcoded DNS/IP assumptions, 7+ loopback defaults for databases and brokers, Docker-specific resolvers in proxies and a healthcheck bound to localhost instead of the pod IP
  • gave a concrete recommendation for each finding: replace defaults with mandatory env variables that fail fast at startup, move the Docker network to K8s Services, extract hardcoded gRPC addresses into config
  • flagged a separate class of problems: a service with a peer's address baked into compiled code — needs refactoring, not a config change
Result

On schedule

the product's K8s sandbox is deployed and running, Q2 2026

  • the document was adopted as the architectural basis for planning the K8s migration
  • a backlog of technical stories was formed for the platform and infrastructure teams for Q3
Stack
KubernetesDocker ComposeAnsibleGoPHPHAProxyNginxgRPC
02Storage · ADR

ADR: choosing a new S3 backend for product shipments

Context

The product ships to customers with built-in S3 storage — one instance per installation. Production volume: ~8 TiB, 1.8M objects; the storage is used by the main application, several Go services, an Ansible playbook, DB backup tools, a container registry and a corporate messenger. The current S3 backend changed the licensing policy of its OSS edition (part of the functionality moved to Enterprise, the console was removed from community) — shipping it on-prem to customers is legally risky, all the more so given import-substitution requirements.

What I did
  • built an S3 requirements matrix — 20+ criteria: Data/Control Plane, Event Notifications → AMQP, Bucket Lifecycle, IAM Bucket Policy, SSE-KMS, Prometheus metrics, path-style, Sigv4, compatibility with three S3 clients and the backup tooling
  • compared three options: status quo (100% of the matrix, but a licensing blocker); option A — rejected (no Event Notifications over AMQP, no SSE-KMS, limited Lifecycle, AGPL); SeaweedFS (Apache 2.0, ~95% of the matrix, AMQP → RabbitMQ, compatible with all clients)
  • chose SeaweedFS — the only option with an OSS license free of feature-gating and suitable for shipping to customers
  • designed a test plan: 15 Spike cases (Go/No-Go) + 15 PoC/prod — multipart upload >10 GB, presigned URLs with header overrides, Bucket Lifecycle, SSE-KMS via an external KMS, a 30-min load run to compare p99 latency
  • analyzed storage schemes: replication (×2 overhead, from 2 nodes) vs. Erasure Coding 10+4 (×1.4 overhead, from 14 nodes) — with a recommendation per data group
  • prepared a 10-step production migration plan: sync with checksum verification, a read-only cutover window, smoke checks, a control operation period
Result

Apache 2.0

licensing risk removed — SeaweedFS approved for all new shipments

  • all existing clients stay compatible with no code changes — only endpoint and credentials change
  • Spike and PoC scheduled for Q3 2026
Stack
SeaweedFSS3 APIRabbitMQWAL-GresticrclonePrometheusGoPHPPython
03Process · OS certification

A certification process for new operating systems

Context

The product runs on several Linux distributions; enterprise customers in Russia request support for domestic OSes. Adding a new OS was informal: an engineer would add the distribution to the allowed list and consider it done. Without a clear gate an OS could enter the documentation without a full verification cycle (load testing skipped, distributed/offline modes unchecked) — the risk being that a customer gets an OS on the supported list and hits an incompatibility at deployment.

What I did
  • designed a process with 3 OS statuses (Supported / Deprecated / Removed) and a 4-stage SDLC checklist: Assessment → In Progress (Done) → Testing → Released
  • defined the task structure: Feature → User Stories per team → Subtasks for each type of work (specification, test plan, load-test plan, environments, documentation)
  • set requirements for the test environments: matching OS/Docker/Compose versions, installed and configured automatically via a pipeline/ChatOps before work starts
  • fixed a mandatory entry gate for work: OS Ansible facts, Docker/containerd/Compose details, load-test scope (agreed with the Scaling Team), known risks
  • specified the final artifacts: MR/branch, CI jobs (pre-check/deploy/post-check), smoke/E2E, k6 artifacts (runtime.zip, JSON, xlsx, HTML, Grafana), Scaling Team verdict, known limitations
  • made load testing a mandatory gate for Supported status and defined re-verification triggers: a change of OS major/minor version, Docker pins, repository, kernel/cgroup defaults, CA/GPG/proxy, key components or the base k6 scenario
Result

2 OSes

support confirmed within a quarter, Q2 2026

  • the process was adopted and submitted for approval
  • a reproducible gate was established: an OS counts as supported only after all stages and after the result is recorded in code, task and documentation
Stack
AnsibleDockerk6PlaywrightPrometheusGrafanaGitLab CI
04Storage · audit

Object-storage audit — 18 buckets, ≥400 GB

Context

The product uses external S3 storage for release artifacts, DB backups, CI artifacts and auxiliary services. The exact volume wasn't tracked — capacity planning was done roughly.

What I did
  • ran a read-only inventory of 18 buckets without modifying data
  • recorded volume, object count, last-write date and content type for each bucket
  • established that ~75% of the volume (≥300 GB) was release artifacts accumulated since 2022 with no retention policy
  • identified several backup repositories with no retention limits — uncontrolled volume growth
  • found buckets with no writes for 1.5–4 years totaling ≥19 GB (test-environment backups, registry images, repository mirrors) and duplicate rebuilds of a single release minor
  • prepared prioritized recommendations: retention for releases, forget --prune (restic), wal-g delete retain, lifecycle expiration for temporary artifacts, per-bucket monitoring
Result

up to 180 GB

reclaimable potential + ≥19 GB from inactive buckets

  • backup repositories with no retention limits were surfaced — growth prevented before a capacity incident
  • the audit ran with no downtime and no data changes
Stack
S3 APIPythonrcloneWAL-Grestic

ITGLOBAL.COM · Head of Managed Services

Management cases at ITGLOBAL.COM

Managed Services — a team of 13 engineers (DevOps, SRE, Managed Apps, Linux/Windows, DBA). The focus: turn service operations from a set of manual agreements into a manageable engineering system — with clear ownership, measurable queues, transparent economics and reproducible service quality.

−88%team tech debt: 286 → 34 tasks
5.9 daysmedian cycle time (was 7); p90 — 19 days (was 28)
×2DevOps-service revenue from a key client
+48%revenue per engineer-hour (custom service)
7 minresponse SLA on the custom service, 24×7
4productized managed services
05Operations · ITSM/SDLC

Building a manageable operation for the engineering department

Context

The status of a large share of work had to be checked with the people doing it. Operational and project tasks were mixed, engineers chose their next task themselves, and management had no single set of metrics for queues, load and cycle time.

What I did
  • split operational work in ITSM from project work in SDLC
  • created separate queues for incidents, requests, problems, changes and unassigned tasks
  • introduced priority-based queue processing instead of engineers self-selecting tasks
  • set requirements for keeping statuses and comments current on long-running tasks
  • rolled out metrics for queue age and size, staff load, effort and cycle time
  • tied operational metrics to the team's monthly KPI
Result

−88%

tech debt: 286 → 34 tasks

  • median cycle time dropped from 7 to 5.9 days
  • p90 time-to-close dropped from 28 to 19 days
  • work status became available from ITSM/SDLC without polling the people doing it
06Team · structure

Restructuring a team of 13 engineers

Context

People were grouped mostly by historically formed technology specializations. Areas of responsibility overlapped, the manager remained the entry point for a large number of operational questions, and context switching hurt productivity.

What I did
  • split the department into three tracks: DevOps, SRE and Managed Apps
  • appointed leads and assigned services and areas of responsibility to the teams
  • built a roles-and-FTE model for capacity planning
  • introduced a quarterly performance-review cycle and regular one-to-ones
  • developed a competency matrix for the DevOps track
  • built mentoring, knowledge sharing and process improvement into the incentive system
Result

3 teams

DevOps, SRE and Managed Apps — with leads and ownership

  • operational and technical decisions were delegated to the leads
  • load could now be planned not just per person but per track
  • quarterly performance reviews became a regular process for the whole team
  • new DevOps and SRE projects were launched alongside ongoing operations
07Product · services

Redesigning the Managed Services portfolio

Context

Existing service descriptions didn't always make it possible to pin down the scope of work, the limits and the responsibilities of client and provider. That created risks at presale, at service activation, in operation and in later billing.

What I did

Productized four core managed services — Managed Monitoring, Managed Logging, Software Backup and Managed OS. For the portfolio I prepared:

  • unified service descriptions in Russian and English
  • SLAs and responsibility matrices
  • activation requirements and questionnaires
  • lists of typical requests
  • rules for changing parameters and deactivating services
  • GPLs and billing units
  • presale calculators
  • XS–XL engineer-hour packages with progressive discounts
Result

4 services

Monitoring, Logging, Backup, OS — with SLAs and presale calculators

  • service scope and boundaries became consistent for sales, architects and operations
  • repeatable procedures appeared for presale, activation and handover to support
  • services got measurable billing units: VM, service, cluster, instance, storage volume and engineer-hours
  • the risk of unpaid work outside the agreed SLA went down
08Economics · P&L

Department economics and billing automation

Context

Data on revenue, billed services, effort and team cost lived in different systems and reports. It was hard to tell the profitability of a specific client or service, or to separate billable activity from operational losses.

What I did
  • consolidated data from billing, 1C, ITSM and timesheets
  • built the department's first P&L model
  • introduced plan-vs-actual for revenue and costs
  • started measuring gross margin by service
  • added revenue and profit per employee
  • automated part of the monthly billing reports
  • set up regular effort analysis by client and service
Result

On one contract the analysis showed that the actual cost of work exceeded the payment received. After reworking the service scope:

68%

financial effect from the freed engineering capacity

  • the unpaid volume of work that was stopped came to ~30% of the contract's effort
  • the freed capacity was redirected to higher-margin projects
09Commercial · pricing

Rebuilding the commercial model of a DevOps service

Context

At a large product client the actual volume of DevOps work and the payment model in use had drifted apart. Development, maintenance, consulting and infrastructure support were all mixed within a single contract.

What I did
  • audited tasks, effort and infrastructure objects
  • split the work into Build and Support
  • calculated the required team composition and FTE shares
  • developed T&M and package-pricing models
  • set separate rates for junior, middle, senior and architect roles
  • standardized monthly reporting for DevOps and Managed IT
  • prepared a service matrix and a cost calculator for the supported infrastructure
Result

×2

DevOps-service revenue from a key client

  • the commercial model now reflected the real team structure and the nature of the work
  • a transparent link appeared between support volume, engineering capacity and the price charged
  • the client's reporting and internal billing were brought to a single format
10Reliability · observability

Advancing observability and PIR practice

Context

Health models for some services were out of date, some alerts created extra noise, and knowledge about the architecture and failure scenarios stayed with individual engineers. After a major incident with the DNS service it turned out that part of the PostgreSQL/Patroni configuration had been applied manually and wasn't stored in the distributed configuration store. During a cluster switchover this broke replication.

What I did
  • organized an update of service health models
  • introduced a dedicated health model and alerting for the DNS service
  • tuned alerts for PostgreSQL and PHP-FPM
  • formalized the timeline of the major incident and its root cause
  • coordinated communication between engineers, adjacent teams and the service center
  • moved corrective actions from manual operations into cluster configuration and automated deployment
  • captured the changes in DCS/etcd and infrastructure playbooks
Result

80%

of service health models updated

  • the incident's cause was separated from its symptoms and recorded in the PIR
  • critical configuration no longer depended on a manual change to a specific node
  • a reproducible scenario appeared for recovery and cluster re-initialization
  • the incident's technical conclusions were turned into concrete automation changes
11Custom service · SLA

Full lifecycle of a custom service: monitoring and alerting with a 7-minute 24×7 response

Context

The client needed not a catalog-standard monitoring service but a custom one for its critical services — with a guaranteed incident response in 24×7 mode. The portfolio had no ready product for that response level, and one-off agreements gave neither predictable quality nor clear economics.

What I did

Took the service through the full lifecycle — from requirements to operation and billing:

  • gathered requirements, monitored objects and critical scenarios, agreed thresholds and priorities
  • designed and built custom monitoring and alerting for the client's services
  • set a 7-minute response SLA in 24×7 mode with on-call, routing and escalations
  • packaged the service commercially: scope of work, billing units, SLA matrix and calculator
  • ran activation, handover to operations and regular reporting
Result

+48%

revenue per engineer-hour

7 min

response SLA, 24×7

  • a reproducible template was created for similar custom services — from presale to operation

Approach

A shared approach

Across every case — engineering and management alike — I use the same principle:

  1. make the current state transparent;
  2. define measurable metrics;
  3. establish clear ownership;
  4. eliminate manual and informal operations;
  5. tie technical changes to an economic or operational result.

My job as a leader isn't to do all the engineering work myself, but to build a system where the team consistently makes decisions, keeps services running and evolves the infrastructure without constant manual oversight.

P.S. A similar task — bring order to operations, get infrastructure ready for Kubernetes, choose a storage backend, or build a manageable operation and tie it to economics? We can discuss it via contact or separately on consulting at gomanov.pro