DevOps Engineering Projects

Every project below is a real broken system - the kind of DevOps problem teams actually hit in production, not a tutorial. Fix it in a live cloud workspace and it lands on your portfolio as a clickable proof point.

38 projects to build

Fix the Nginx 502 Bad GatewayCaught a port mismatch between the nginx upstream block and the actual app port, restoring traffic through thenginxlinuxreverse-proxyRecover a Crashed Linux ServiceFound the app crashing because INVENTORY_DB environment variable was not set, exported it, and restarted the alinuxpythonenvironment-variablesCorrect a Postgres Port MismatchFound postgresql.conf listening on a non-default port after a config change, realigned the app or postgres to postgreslinuxconfigurationReopen the Redis Bind Address (Connection Refused)Caught Redis bound to 127.0.0.1 only after a config change, switched bind to the right interface so the app caredispythonflaskResolve an Nginx 403 Forbidden (Permissions)Restored read+execute permissions on the document root so nginx (running as nginx user) can serve the HTML filnginxlinuxpermissionsFix a Docker Container That Exits ImmediatelyCorrected the Dockerfile CMD to reference the real entrypoint script so the container actually runs a process dockercontainersdockerfileWrite a Production-Ready DockerfileCreated a Dockerfile for a Python Flask app - python:3.12-slim base, dedicated non-root user, exposed port 808dockerdockerfilepythonRepair a Failing GitHub Actions WorkflowRepaired the GitHub Actions workflow that failed on every push - fixed the malformed YAML, moved checkout befoci-cdgithub-actionsyamlShrink a Bloated Docker Image (Multi-Stage Build)Rewrote the single-stage Dockerfile as multi-stage so the 200MB build-time intermediate stays in the builder ldockerdockerfilemulti-stagePatch a Critical CVE Flagged by TrivyTrivy was failing CI with a CRITICAL CVE on pyyaml 5.3 - bumped the pin in requirements.txt to 5.4+ (the fixedtrivycvesecurityWrite a Production systemd Service UnitWrote a production-grade systemd unit for the Flask app - Type=simple, ExecStart points at the venv python, Resystemdlinuxservice-managementGet a Terraform Plan to PassFixed three issues in the Terraform config that were blocking `terraform plan` - an unclosed block, a referencterraformiachclProvision an AWS S3 Bucket With TerraformFixed a typo in the aws_s3_bucket resource so the AWS provider accepted the argument and `terraform apply` actterraformawss3Lock Down an Over-Permissive AWS IAM PolicyReplaced the wildcard Action and Resource on the deployer IAM policy with the single S3 action + specific buckawsiamterraformDeploy an AWS Lambda Function With TerraformPointed the `aws_lambda_function` resource at the right zip + handler so `terraform apply` actually shipped thawslambdaterraformProvision an AWS EC2 Instance With TerraformFixed the `aws_instance` resource (real AMI from describe-images + a valid `t3.micro`) so `terraform apply` prawsec2terraformRenew a Let's Encrypt Certificate Before It ExpiresUpdated the broken openssl x509 renewal command in renew.sh to issue a fresh 90-day cert before the existing otlsletsencryptopensslAmend a Botched Git Commit MessageUsed `git commit --amend -m '...'` to rewrite the most recent commit's message from a typo'd draft to the corrgitcommitversion-controlTrap SIGTERM for a Graceful ShutdownAdded a SIGTERM handler that flips `RUNNING = False`, lets the in-flight job finish, then exits - so KubernetepythonflasksignalsTrace an Nginx 503 CascadeFixed upstream timeout + health check path mismatch in nginx so health probes hit the right endpoint and slow nginxreverse-proxytimeoutsPlug a Postgres Connection Pool LeakWrapped DB calls in try/finally so connections always release back to the pool, even on error - pool stopped epythonpostgresconnection-poolIndex a Slow Postgres Search QueryDiagnosed seq-scan on the search column via EXPLAIN, added an index, and the endpoint went from 3-5 seconds topostgresindexingsqlConfigure an Nginx Rate LimitLoosened the over-aggressive limit_req zone + burst settings so legitimate traffic flows while still bouncing nginxrate-limitingflaskMake an App Wait for Postgres on StartupWrapped the startup DB connect in retry-with-backoff so the app survives the few seconds postgres takes to accpostgresflaskrace-conditionRefactor Terraform Into a Reusable ModuleExtracted the three duplicated service blocks in main.tf into a reusable module under ./modules/service - rootterraformiacmodulesReconcile Terraform State DriftReconciled the Terraform state with what someone had manually edited on disk - refreshed state, decided what tterraformiacdriftRepair a Broken Prometheus Scrape ConfigPointed the broken Prometheus scrape config at the right port and exposed the missing app_requests_total countprometheusobservabilitymetricsWrite an Idempotent Ansible PlaybookWrote an idempotent Ansible playbook that templates the nginx site config, ensures the docroot exists with theansibleconfiguration-managementplaybookDesign an Observability StackPicked the "metrics + structured logs + dashboards" stack - the workload says "debug a perf regression that habashprometheussystem-designSpeed Up a Slow GitHub Actions PipelineCut the GitHub Actions pipeline from a single serial job to a parallel matrix with dependency caching, droppinci/cdgithub-actionscachingMigrate a Postgres Database With Zero DowntimeReplaced the naive ALTER TABLE ADD COLUMN NOT NULL with a three-step zero-downtime migration (add nullable, bapostgresmigrationszero-downtimeWire Up an AWS SQS Dead-Letter QueueCreated a separate DLQ queue + attached a RedrivePolicy with maxReceiveCount=3 to the main queue so poison mesawssqsdlqLoad Config From AWS SSM Parameter StoreSwitched `app.py` from reading `DATABASE_URL` out of env to fetching `/app/database/url` from AWS SSM Parameteawsssmparameter-storeProvision an AWS VPC and Security GroupCreated the missing VPC + subnet + SG resources and wired the `aws_instance` to land in the VPC with a port-80awsec2vpcUse git bisect to Find a Breaking CommitWalked `git bisect` between a known-good and known-bad commit, ran the test script at each step, and isolated gitbisectdebuggingShip a Zero-Downtime Blue-Green DeployShipped deploy.sh that boots the new instance on 8081, waits for health checks, switches the nginx upstream, anginxdeploymentzero-downtimePackage an App as a Helm ChartCreated a Helm chart for the API with Deployment + Service templates, parameterized via values.yaml - helm linhelmkuberneteschartsMove Secrets Into HashiCorp VaultPushed API_KEY / DB_PASSWORD / JWT_SECRET from the checked-in .env into Vault (KV v2 at secret/app), rewrote avaultsecretssecurity

Plus 33+ more DevOps projects in the workspace, with new ones added regularly.

More for DevOps engineers

DevOps roadmapInterview questionsResume projectsCareer guide

Build your DevOps portfolio free. Fix real systems in a live cloud workspace - every fix is yours to keep.

Start free →