DevOps Engineering Projects
Every project below is a real production system - the kind of DevOps problem teams actually hit in production, not a tutorial. Complete it in a live cloud workspace and it lands on your portfolio.
Get started - freeLive cloud workspace in your browser · nothing to install
51 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 theRecover a Crashed Linux ServiceFound the app crashing because INVENTORY_DB environment variable was not set, exported it, and restarted the aRestore a Misplaced Linux Config FileTailed the Flask log, saw `FileNotFoundError: [Errno 2] No such file or directory: '/workspace/config.json'`, Bind a Node App to 0.0.0.0 (All Interfaces)Switched the Node app from listening on 127.0.0.1 to 0.0.0.0 so nginx (different interface) can actually conneCorrect a Postgres Port MismatchFound postgresql.conf listening on a non-default port after a config change, realigned the app or postgres to Repair a Broken JSON Config FileFound a trailing comma / unquoted key in config.json that crashed the app's startup loader, fixed the syntax aReopen 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 caResolve an Nginx 403 Forbidden (Permissions)Restored read+execute permissions on the document root so nginx (running as nginx user) can serve the HTML filDebug an App That Hangs on StartupIdentified an upstream connection blocking startup forever, fixed the config (wrong port → right port) so the Create a Missing Log Directory (Startup Crash)Found the app crashing because /workspace/logs/ did not exist, created the directory, started the appFix a Docker Container That Exits ImmediatelyCorrected the Dockerfile CMD to reference the real entrypoint script so the container actually runs a process Write a Production-Ready DockerfileCreated a Dockerfile for a Python Flask app - python:3.12-slim base, dedicated non-root user, exposed port 808Repair a Failing GitHub Actions WorkflowRepaired the GitHub Actions workflow that failed on every push - fixed the malformed YAML, moved checkout befoShrink 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 lPatch 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 fixedWrite a Production systemd Service UnitWrote a production-grade systemd unit for the Flask app - Type=simple, ExecStart points at the venv python, ReGet a Terraform Plan to PassFixed three issues in the Terraform config that were blocking `terraform plan` - an unclosed block, a referencChoose the Right Deployment StrategyRead three deploy scripts (rolling / blue-green / canary), ran the one that fits the workload spec - rolling rProvision an AWS S3 Bucket With TerraformFixed a typo in the aws_s3_bucket resource so the AWS provider accepted the argument and `terraform apply` actLock Down an Over-Permissive AWS IAM PolicyReplaced the wildcard Action and Resource on the deployer IAM policy with the single S3 action + specific buckDeploy an AWS Lambda Function With TerraformPointed the `aws_lambda_function` resource at the right zip + handler so `terraform apply` actually shipped thProvision an AWS EC2 Instance With TerraformFixed the `aws_instance` resource (real AMI from describe-images + a valid `t3.micro`) so `terraform apply` prBack Up a Postgres Database to AWS S3Wrote a streaming `pg_dump | gzip | aws s3 cp -` script so the nightly backup lands in S3 as a single compressLaunch an AWS EC2 Instance With TerraformCreated an aws_instance resource in main.tf (ami-12345678, t2.micro) and exposed its ID as an instance_id outpRenew 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 oGet a Failing CI Test Job GreenFixed the GitHub Actions test job that ran pytest against a directory that did not exist, so CI now executes tAmend a Botched Git Commit MessageUsed `git commit --amend -m '...'` to rewrite the most recent commit's message from a typo'd draft to the corrTrap SIGTERM for a Graceful ShutdownAdded a SIGTERM handler that flips `RUNNING = False`, lets the in-flight job finish, then exits - so KuberneteOptimize a Slow Python Log Parser (Regex Hot Loop)Hoisted `re.compile(LOG_PATTERN)` out of the per-line loop into a module-level constant, eliminating ~1M redunTrace an Nginx 503 CascadeFixed upstream timeout + health check path mismatch in nginx so health probes hit the right endpoint and slow Plug a Postgres Connection Pool LeakWrapped DB calls in try/finally so connections always release back to the pool, even on error - pool stopped eIndex a Slow Postgres Search QueryDiagnosed seq-scan on the search column via EXPLAIN, added an index, and the endpoint went from 3-5 seconds toConfigure an Nginx Rate LimitLoosened the over-aggressive limit_req zone + burst settings so legitimate traffic flows while still bouncing Make 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 accRefactor Terraform Into a Reusable ModuleExtracted the three duplicated service blocks in main.tf into a reusable module under ./modules/service - rootReconcile Terraform State DriftReconciled the Terraform state with what someone had manually edited on disk - refreshed state, decided what tRepair a Broken Prometheus Scrape ConfigPointed the broken Prometheus scrape config at the right port and exposed the missing app_requests_total countWrite an Idempotent Ansible PlaybookWrote an idempotent Ansible playbook that templates the nginx site config, ensures the docroot exists with theDesign an Observability StackPicked the "metrics + structured logs + dashboards" stack - the workload says "debug a perf regression that haSpeed Up a Slow GitHub Actions PipelineCut the GitHub Actions pipeline from a single serial job to a parallel matrix with dependency caching, droppinMigrate a Postgres Database With Zero DowntimeReplaced the naive ALTER TABLE ADD COLUMN NOT NULL with a three-step zero-downtime migration (add nullable, baWire Up an AWS SQS Dead-Letter QueueCreated a separate DLQ queue + attached a RedrivePolicy with maxReceiveCount=3 to the main queue so poison mesLoad Config From AWS SSM Parameter StoreSwitched `app.py` from reading `DATABASE_URL` out of env to fetching `/app/database/url` from AWS SSM ParameteProvision 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-80Use 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 Ship a Zero-Downtime Blue-Green DeployShipped deploy.sh that boots the new instance on 8081, waits for health checks, switches the nginx upstream, aBuild a Multi-Stage CI Pipeline With CachingCreated a production-grade GitHub Actions workflow - three jobs (lint → test → build) with dependency orderingStand Up Prometheus and AlertmanagerWired Prometheus to Alertmanager - added an `alerting:` block pointing at AM, deployed both binaries, drove a Package an App as a Helm ChartCreated a Helm chart for the API with Deployment + Service templates, parameterized via values.yaml - helm linSet Up Multi-Region AWS Failover With Route 53Wired Route 53 failover records on a hosted zone (PRIMARY -> us-east-1, SECONDARY -> us-west-2) with a health Move Secrets Into HashiCorp VaultPushed API_KEY / DB_PASSWORD / JWT_SECRET from the checked-in .env into Vault (KV v2 at secret/app), rewrote a
Plus 20+ more DevOps projects in the workspace, with new ones added regularly.
More for DevOps engineers
Do real production work, free. Live cloud workspaces in your browser - every project you complete lands on your portfolio.
Get started - free