I break thingson purpose, soproduction doesn't.
I'm a DevOps/SRE engineer with 4+ years of building and running Kubernetes platforms, highly available databases and the DNS and TLS edge in front of them. I don't trust a system until I've broken it on purpose and watched it recover, so I rehearse failures and publish the drills. Open to remote or relocation.
The 30-second version
for recruiters- Role
- DevOps / SRE Engineerplatform, reliability, delivery
- Experience
- 4+ years in DevOpssince Jan 2022 · two of four roles part-time
- Now
- DevOps Engineermulti-tenant SaaS · since May 2025
- Location
- Tehran, Iran · UTC+3:30open to remote and relocation
- Hands-on with
- Kubernetes, replicated PostgreSQL and MongoDB, self-hosted DNS and TLS, monitoringmostly self-hosted, often on restricted networks
- Contact
- [email protected]email is fastest
Keywords: Kubernetes · Docker · Helm · Argo CD · GitOps · Terraform · Ansible · CI/CD (GitHub Actions, GitLab CI, Jenkins) · Prometheus · Grafana · Loki · ELK · PostgreSQL · Patroni · MongoDB · Valkey/Redis · Nginx · Caddy · PowerDNS · TLS/ACME · Linux · AWS (EC2, S3) · Python · Shell
What happens between Enter and the first byte.
Follow one request through a stack I run, from the browser to the database and back. The timings are real: medians of 876 probes my own monitoring sent to a production site, through the CDN, over 12 hours.
The site's real hostname is hidden. Probes run every 15 s from my monitoring host through the public CDN path; numbers are 12-hour medians from Prometheus.
I run the front door: DNS, CDN and TLS.
When customers bring their own domains, someone has to answer DNS for them and hand out certificates without opening the door to abuse. That's the part I build.
- at workSelf-hosted PowerDNS with API-driven automation, and certificates issued and renewed automatically for customer domains.
- my labtls-edge-on-demand: Caddy on-demand TLS behind an allowlist service I wrote, with a drill that floods it with made-up names.
Clusters that deploy even when the internet doesn't cooperate.
Most public registries are blocked from Iran. I keep production shipping anyway.
- at workHarbor as an in-country registry, so deployments stop depending on blocked registries; mirrors and toolcaches for CI.
- my labgitops-platform: Argo CD app-of-apps on kind, dev and staging from one set of manifests, default-deny network policy proven on a live cluster.
Kill the primary database. Count what gets lost.
This replays the failover drill from my Patroni lab: the main database dies while an app is writing to it. Watch how long writes stop, and whether any confirmed write disappears.
In plain terms: the main database died, saving paused for 17 seconds, then a standby took over and not one saved record was lost.
Lab replay at 3× speed. Measured run: largest gap between two acknowledged writes 17,045 ms; 0 acknowledged writes lost; old primary rejoined as a replica.
- at workPatroni PostgreSQL, MongoDB replica sets and Valkey with Sentinel: failovers, replica rebuilds and backups I handle in production.
- my labWhy 17 s: nobody is promoted until the dead leader's lock expires (ttl 15 s) and HAProxy notices (2 × 1 s checks). Why 0 lost: synchronous replication acknowledges a commit only once a standby has it.
Monitoring that I monitor too.
I built the monitoring for a production server from scratch with Terraform, then ran it under synthetic traffic overnight.
- my buildinfra-observability: Prometheus, Alertmanager, Grafana, Loki and Alloy deployed by Terraform; nginx logs turned into per-site error and latency metrics; 22 alert rules.
- my labsre-observability: multi-window burn-rate SLO alerts, unit-tested with promtool. The page fires about 20 s after injecting 30% errors and clears about 14 s after the fix.
- Host load jumps to 12 right after deploy. cAdvisor hit its 256 MB limit and was swapping; disk I/O at 100%.
- Fixed: every container gets
memory_swap = memory; cAdvisor's disk metric disabled. Load back under 1. - Grafana 13 tries to update its own Prometheus and Loki plugins. The plugin CDN answers 403 to Iranian IPs and leaves them unregistered: every dashboard silently shows "No data".
- Found from a screenshot, fixed by disabling plugin auto-install. Prometheus kept every sample, so no data was lost.
- I now verify dashboards through Grafana's own query API, not only against Prometheus.
Pipelines that tell the truth.
Every change reaches production through git, and through a pipeline that fails loudly instead of quietly.
- at workJenkins, Argo CD, GitLab CI and Gitea Actions across development, staging and production; SonarQube code inspection.
- my labci-cd-reference: toolchain preflight, secret scanning, matrix builds with SBOMs, one required gate, and a watchdog that opens an issue when the newest commit on main was never tested.
- my labsre-runbooks: on-call runbooks that each state how they were verified; CI rejects one with a missing section.
Four stages passed. The next one is yours to approve.
Seven repos you can run yourself.
Published in October 2026. Each rebuilds, in public and in miniature, something I run at work. Five of the seven ship a drill that proves their claim in CI.
Let's talk.
Remote or relocation. Email is the fastest way to reach me.