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 thenginxlinuxreverse-proxyRecover a Crashed Linux ServiceFound the app crashing because INVENTORY_DB environment variable was not set, exported it, and restarted the alinuxpythonenvironment-variablesRestore a Misplaced Linux Config FileTailed the Flask log, saw `FileNotFoundError: [Errno 2] No such file or directory: '/workspace/config.json'`, linuxfilesflaskBind 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 connenginxnodejsnetworkingCorrect a Postgres Port MismatchFound postgresql.conf listening on a non-default port after a config change, realigned the app or postgres to postgreslinuxconfigurationRepair a Broken JSON Config FileFound a trailing comma / unquoted key in config.json that crashed the app's startup loader, fixed the syntax aflaskjsonpythonReopen 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 filnginxlinuxpermissionsDebug an App That Hangs on StartupIdentified an upstream connection blocking startup forever, fixed the config (wrong port → right port) so the pythonflaskconfigurationCreate a Missing Log Directory (Startup Crash)Found the app crashing because /workspace/logs/ did not exist, created the directory, started the appnodejslinuxfile-systemFix 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 referencterraformiachclChoose the Right Deployment StrategyRead three deploy scripts (rolling / blue-green / canary), ran the one that fits the workload spec - rolling rbashsystem-designarchitectureProvision 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` prawsec2terraformBack 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 compressawss3postgresLaunch 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 outpawsec2terraformRenew 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 otlsletsencryptopensslGet 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 tci-cdgithub-actionstestingAmend 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 KubernetepythonflasksignalsOptimize 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 redundevopspythonperfTrace 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-downtimeBuild a Multi-Stage CI Pipeline With CachingCreated a production-grade GitHub Actions workflow - three jobs (lint → test → build) with dependency orderingci-cdgithub-actionscachingStand Up Prometheus and AlertmanagerWired Prometheus to Alertmanager - added an `alerting:` block pointing at AM, deployed both binaries, drove a prometheusalertmanagerobservabilityPackage an App as a Helm ChartCreated a Helm chart for the API with Deployment + Service templates, parameterized via values.yaml - helm linhelmkuberneteschartsSet 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 awsroute53failoverMove 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 20+ more DevOps projects in the workspace, with new ones added regularly.

More for DevOps engineers

DevOps roadmapInterview questionsResume projectsCareer guide

Do real production work, free. Live cloud workspaces in your browser - every project you complete lands on your portfolio.

Get started - free
Get started - free