A delivery-services API aggregator
A single API over a dozen courier services: cost calculation, order creation and real-time tracking.
Technology
Application containerization: reproducible environments, multi-stage builds, Docker Compose for local development.
Docker became my standard way of packaging and delivering applications eight years ago and since then has eliminated the eternal works-on-my-machine problem. Containerization provides reproducible environments: the same image travels from the developer laptop through CI to production, behaving identically. I write clean Dockerfiles with multi-stage builds, separating the compilation and dependency-installation stage from the final runtime so the resulting image is minimal and contains no extra tools. For PHP applications I build images on the official php-fpm and alpine base, enable only the needed extensions, and configure OPcache and preloading; for Go I use a static binary build and a final image on scratch or distroless, getting a container only a few megabytes in size. I work carefully with layer caching: I move dependency installation into separate steps and use .dockerignore to speed up builds and avoid bloating the context. Security questions are mandatory for me: I run processes as a non-privileged user, pin base-image versions, regularly rebuild and scan images for vulnerabilities, and never put secrets inside layers, passing them through environment variables and secret mechanisms. For local development I describe the whole environment in Docker Compose: application, queue, scheduler, database and cache — with healthchecks, dependencies between services and volumes for data. This lets a new developer bring up a full stand with a single command. I understand the difference of the PID 1 process and correct signal handling for graceful shutdown, set resource limits, and design stateless containers, moving state into external stores. I direct logs to stdout/stderr for centralized collection and keep configuration in environment variables per the Twelve-Factor App methodology. Docker for me is not an end in itself but the foundation of the whole delivery pipeline: it makes builds predictable, environments uniform, and opens a direct path to orchestration in Kubernetes and automation in CI/CD.
A single API over a dozen courier services: cost calculation, order creation and real-time tracking.
Collecting and processing an event stream with real-time dashboards on Go, PostgreSQL and Redis.
Gradually extracting microservices from a monolith without downtime: domain boundaries, events and orchestration in Kubernetes.