Backend Developer
A step-by-step path from how HTTP works to running monitored services in production. Every stage uses Node.js and TypeScript, but the ideas carry over to Go, Python or any other server language.
- Before you start
- Basic JavaScript (variables, functions, arrays, objects) and the ability to install software on your own machine. No backend, database or networking experience is needed: the first stage covers the web and terminal basics that everything else builds on.
- Where it gets you
- You can design, build, test and deploy a secure, documented API backed by PostgreSQL and Redis, run background jobs, and keep it healthy in production with logs, metrics and traces. That covers what most junior and mid-level backend job posts ask for.
0 of 56 topics done
Tick a topic once you can explain it and have used it in a project. Progress is saved in this browser.
- Core
- Recommended
- Optional
- Done
- 1
How the Web Works and Your Toolkit
About 2-3 weeks0/5
Explain what happens between typing a URL and getting a response, and work comfortably in a terminal with Git.
Build: URL Inspector Script
Write a shell script that takes a URL and prints its DNS records, TLS certificate issuer and expiry, status code and response headers. Keep it in a GitHub repo with a README that explains each line of output.
- 2
Node.js and TypeScript in Depth
About 4-6 weeks0/7
Write non-blocking, typed Node.js programs and explain how the event loop runs them.
Build: Streaming Log Analyzer
Build a TypeScript CLI that streams a multi-gigabyte access log and reports status code counts and the slowest endpoints while memory stays flat. Add a flag that moves parsing into a worker thread and compare the timings.
- 3
Building HTTP APIs
About 3-4 weeks0/6
Design and build a documented REST API with validation, clear errors and pagination.
Build: Bookmarks API
Build a REST API for saving bookmarks with CRUD routes, Zod validation, cursor pagination, tag filtering and Problem Details errors, keeping data in memory for now. Publish an OpenAPI spec and serve interactive docs at /docs.
- 4
Databases and Data Modeling
About 5-6 weeks0/7
Model data in PostgreSQL, write efficient queries, and choose when a document store or Redis fits better.
Build: Bookmarks on PostgreSQL
Move the bookmarks API to PostgreSQL with users, tags as a many-to-many relation, versioned migrations and seed data. Add a bulk import endpoint that runs in one transaction, and use EXPLAIN ANALYZE to justify every index you add.
- 5
Authentication, Authorization and Security
About 3-4 weeks0/7
Add secure login, token handling and permission checks, and defend an API against the most common attacks.
Build: Auth for the Bookmarks API
Add signup and login with Argon2id hashes, short-lived access tokens, rotating refresh tokens in HttpOnly cookies, and admin-only routes. Rate limit the login route and write a test proving a reused refresh token is rejected.
- 6
Caching, Background Jobs and Real-Time
About 3-4 weeks0/6
Make slow reads fast, move slow work off the request path, and push live updates to clients.
Build: Link Preview Service
Add an endpoint that accepts a URL with an idempotency key, queues a BullMQ job that fetches the page title and image with timeouts and retries, and caches results in Redis. Stream job completion to the browser over Server-Sent Events.
- 7
Testing and Code Quality
About 2-3 weeks0/5
Prove your API works with fast unit tests and realistic integration tests, and keep the codebase consistent.
Build: Test Suite for the Bookmarks API
Write unit tests for the service layer and an integration suite that starts PostgreSQL and Redis in containers and hits every route with Supertest, including auth failures. Make one command run the whole suite on a clean machine.
- 8
Architecture and Scaling
About 4-5 weeks0/7
Structure a growing codebase, reason about system design trade-offs, and find and remove performance bottlenecks.
Build: Modular Bookmarks Platform
Reorganize the API into users, bookmarks and notifications modules with controller, service and repository layers, where bookmark events reach notifications through an outbox table and a worker. Load test the list endpoint before and after your caching and pooling changes and record the p95 results in the README.
- 9
Shipping and Running in Production
About 3-4 weeks0/6
Package, deploy and monitor a backend service, and know what to do when it breaks.
Build: Production Launch
Containerize the bookmarks platform and deploy it with managed PostgreSQL and Redis through a GitHub Actions pipeline, on a custom domain with HTTPS. Add JSON logs, OpenTelemetry traces, health checks and a written rollback plan, then break something on purpose and find it through the traces.
Where it gets you
You can design, build, test and deploy a secure, documented API backed by PostgreSQL and Redis, run background jobs, and keep it healthy in production with logs, metrics and traces. That covers what most junior and mid-level backend job posts ask for.
Core must know for the roleRecommended expected in most jobsOptional for specific teams or later
How the Web Works and Your Toolkit
About 2-3 weeks
Explain what happens between typing a URL and getting a response, and work comfortably in a terminal with Git.
Internet and Networking Basics
CoreEvery backend call rides on IP, TCP and ports, so knowing them makes timeouts and connection errors much easier to debug.
- Clients, servers and IP addresses
- TCP vs UDP and ports
- What localhost and 0.0.0.0 mean
- Latency, bandwidth and round trips
- Proxies and load balancers, briefly
HTTP in Practice
CoreHTTP is the contract between your API and its clients, so you need to read and write it fluently before building anything.
- Request line, headers and body
- GET, POST, PUT, PATCH, DELETE
- Status code classes 2xx to 5xx
- Content-Type and content negotiation
- Cookies and the Set-Cookie header
- CORS and preflight requests
- HTTP/2 and HTTP/3 at a glance
- Inspecting traffic with curl -v
DNS, Domains and TLS
CoreDeploying anything means pointing a domain at a server and serving it over HTTPS, which depends on DNS and TLS.
- A, AAAA, CNAME, MX, TXT records
- TTLs and propagation delays
- Looking up records with dig
- TLS handshake and certificates
- Certificate authorities and Let's Encrypt
- Why HTTPS is mandatory
Linux Shell Basics
CoreServers, containers and CI runners are Linux machines driven from a shell, so terminal fluency pays off in every later stage.
- Navigating and editing files
- Permissions and ownership
- Pipes, redirects and grep
- Processes, signals and open ports
- Environment variables and PATH
- SSH keys and remote login
- Installing packages with apt
Git and GitHub Workflow
CoreEvery team ships code through Git, and clean commits and pull requests are how reviewers judge your work.
- Commits, staging and history
- Branches, merge and rebase
- Resolving merge conflicts
- Remotes, push and pull
- Pull requests and code review
- .gitignore and keeping secrets out
Build: URL Inspector Script
Write a shell script that takes a URL and prints its DNS records, TLS certificate issuer and expiry, status code and response headers. Keep it in a GitHub repo with a README that explains each line of output.
Node.js and TypeScript in Depth
About 4-6 weeks
Write non-blocking, typed Node.js programs and explain how the event loop runs them.
Modern JavaScript for Servers
CoreBackend code is mostly async data handling, so promises, errors and modern syntax need to feel natural before you touch a framework.
- Closures and scope
- Promises and async/await
- Promise.all and Promise.allSettled
- try/catch and custom Error classes
- Destructuring, spread, optional chaining
- map, filter and reduce
- Classes vs plain objects
The Node.js Runtime and Event Loop
CoreNode.js runs your code on one main thread, so knowing how the event loop schedules work tells you what makes a server slow.
- Installing Node.js 24 LTS
- Call stack and event loop phases
- Microtasks vs timers and I/O callbacks
- libuv thread pool
- Why CPU-heavy code blocks requests
- process, argv and exit codes
Modules and npm
CoreReal projects are built from packages, so you need to structure modules and manage dependencies without breaking builds or inviting supply chain attacks.
- ES modules vs CommonJS
- package.json fields and scripts
- Semantic versioning ranges
- Lockfiles and npm ci
- npm audit and updating dependencies
- Workspaces for multi-package repos
Streams, Buffers and Files
CoreStreams let a server handle large files and uploads with constant memory, which comes up in both interviews and production incidents.
- Buffers and character encodings
- Readable, writable and transform streams
- stream.pipeline and error handling
- Backpressure and highWaterMark
- Async iteration over streams
- fs/promises for file work
TypeScript for Backend Code
CoreMost Node.js backend jobs now expect TypeScript, and strict types catch whole classes of bugs before they reach production.
- strict mode and tsconfig basics
- Interfaces, type aliases and unions
- Narrowing and discriminated unions
- Generics for reusable helpers
- Running .ts files with type stripping
- tsc --noEmit as a CI check
Node.js Built-in Modules
RecommendedNode.js ships with tools for files, crypto, HTTP and config, so you can skip extra dependencies for many common tasks.
- node:http server without a framework
- node:crypto for hashes and IDs
- Built-in fetch and AbortController
- Loading config with --env-file
- Restarting on change with --watch
- worker_threads for CPU-bound work
A Second Language: Go or Python
OptionalOnce Node.js feels solid, a second language shows which backend ideas are universal and widens the jobs you can apply for.
- Go: goroutines and net/http
- Python: FastAPI or Django basics
- Compare concurrency models with Node.js
- Rebuild one small API
Build: Streaming Log Analyzer
Build a TypeScript CLI that streams a multi-gigabyte access log and reports status code counts and the slowest endpoints while memory stays flat. Add a flag that moves parsing into a worker thread and compare the timings.
Building HTTP APIs
About 3-4 weeks
Design and build a documented REST API with validation, clear errors and pagination.
Express 5 Fundamentals
CoreExpress is the most widely used Node.js web framework, and its routing and middleware patterns carry over to Fastify, NestJS and Hono.
- App, Router and route handlers
- Route params, query and body
- JSON body parsing and size limits
- Async handlers and rejected promises
- Express 5 path syntax changes
- trust proxy behind load balancers
Middleware and Error Handling
CoreMiddleware adds logging, auth and parsing once for every route, and a single error handler keeps failures consistent.
- Middleware order and next()
- Request IDs and request logging
- Custom error classes with status codes
- One central error handler
- Consistent JSON error shape
- 404 handler for unknown routes
REST API Design
CoreA predictable API is easier to use, cache and change later, so design conventions matter as much as the code behind them.
- Resources as nouns, methods as verbs
- Correct status codes per outcome
- Safe and idempotent methods
- Offset vs cursor pagination
- Filtering, sorting and field selection
- Versioning by URL or header
- Problem Details error format
Validation with Zod
CoreNever trust input: validating every request at the edge blocks bad data and gives you TypeScript types for free.
- Schemas for body, query and params
- safeParse and readable error messages
- Inferring types from schemas
- Coercing query string values
- Validating env variables at startup
- Reusable validation middleware
API Documentation with OpenAPI
RecommendedOpenAPI turns your API into a machine-readable contract that powers docs, client generation and contract tests.
- Paths, operations and components
- Request and response schemas
- Generating specs from Zod schemas
- Serving interactive docs
- Generating typed API clients
GraphQL and gRPC
OptionalSome teams use GraphQL for flexible frontend queries or gRPC for fast service-to-service calls, so know when each one fits.
- GraphQL schema, queries, mutations
- Resolvers and the N+1 problem
- Batching with DataLoader
- gRPC with Protocol Buffers
- Unary vs streaming RPCs
- When plain REST is enough
Build: Bookmarks API
Build a REST API for saving bookmarks with CRUD routes, Zod validation, cursor pagination, tag filtering and Problem Details errors, keeping data in memory for now. Publish an OpenAPI spec and serve interactive docs at /docs.
Databases and Data Modeling
About 5-6 weeks
Model data in PostgreSQL, write efficient queries, and choose when a document store or Redis fits better.
SQL with PostgreSQL
CorePostgreSQL is the default relational database for most new backends, and raw SQL skill outlasts any ORM you pick.
- SELECT, WHERE, ORDER BY, LIMIT
- INNER and LEFT JOINs
- GROUP BY and aggregates
- Subqueries and CTEs
- Upserts with ON CONFLICT
- Window function basics
- JSONB columns and queries
Relational Data Modeling
CoreGood schemas prevent bugs that no application code can fix, so model tables and relationships before writing queries.
- Entities and relationships
- Primary keys: identity vs UUID
- Foreign keys and cascades
- One-to-many and many-to-many
- Normalization up to 3NF
- NOT NULL, UNIQUE, CHECK constraints
- When to denormalize
Indexes and Query Performance
CoreMost slow endpoints trace back to a missing index or a bad query, and reading query plans is how you prove the fix.
- B-tree index basics
- Composite index column order
- Reading EXPLAIN ANALYZE output
- Spotting N+1 queries
- Partial and expression indexes
- Write cost of extra indexes
Transactions and Concurrency
CoreWhen two requests change the same data at once, transactions and locks decide whether your data stays correct.
- ACID properties
- BEGIN, COMMIT and ROLLBACK
- Isolation levels and anomalies
- Row locks with FOR UPDATE
- Optimistic locking with version columns
- Deadlocks and retrying transactions
ORMs, Query Builders and Migrations
CoreTeams change schemas through versioned migrations and usually query through Prisma or Drizzle, so learn one well and know its limits.
- Schema definition in Prisma or Drizzle
- Generating and applying migrations
- Seeding development data
- Parameterized queries against injection
- Dropping to raw SQL when needed
- Safe migrations on live tables
MongoDB and Document Data
RecommendedMany Node.js teams, especially MERN shops, run MongoDB, and document modeling follows different rules than tables.
- Documents, collections and BSON
- Embedding vs referencing
- Indexes in MongoDB
- Aggregation pipeline basics
- Schemas with Mongoose
- When relational fits better
Redis as a Data Store
CoreRedis is the usual in-memory store for caches, sessions, rate limits and queues, so learn its data types before using it in later stages.
- Strings, hashes, lists and sets
- Sorted sets for rankings
- Key expiry with TTLs
- Atomic counters with INCR
- Pub/sub basics
- Persistence and memory limits
Build: Bookmarks on PostgreSQL
Move the bookmarks API to PostgreSQL with users, tags as a many-to-many relation, versioned migrations and seed data. Add a bulk import endpoint that runs in one transaction, and use EXPLAIN ANALYZE to justify every index you add.
Authentication, Authorization and Security
About 3-4 weeks
Add secure login, token handling and permission checks, and defend an API against the most common attacks.
Storing Passwords Safely
CoreLeaked password tables are a classic breach, so hash passwords correctly from the very first login you build.
- Hashing vs encryption
- Argon2id or bcrypt with salts
- Tuning work factors
- Secure password reset tokens
- Constant-time comparisons
- Generic login error messages
Sessions, JWTs and Refresh Tokens
CoreChoosing between server sessions and tokens, and storing them safely, is one of the most common backend design questions.
- Server-side sessions with cookies
- HttpOnly, Secure, SameSite flags
- JWT structure and signature checks
- Short-lived access tokens
- Refresh token rotation and reuse detection
- Logout and token revocation
- CSRF protection for cookie auth
OAuth 2.0 and OpenID Connect
RecommendedSocial login and third-party API access both run on OAuth 2.0 and OIDC, so understand the flows even when a provider does the work.
- Client, resource and authorization servers
- Authorization code flow with PKCE
- Scopes and consent
- ID tokens vs access tokens
- Validating tokens from a provider
- Hosted identity providers
Authorization and Access Control
CoreBroken access control tops the OWASP Top 10, so every route needs an explicit check of who may do what.
- Authentication vs authorization
- Role-based access control
- Resource ownership checks
- Deny by default
- Central permission helpers
- Multi-tenant data isolation
OWASP Top 10 and API Risks
CoreKnowing the most common vulnerabilities lets you avoid them while coding instead of patching them after an incident.
- Injection and parameterized queries
- Misconfiguration and security headers
- Software supply chain failures
- SSRF when fetching user URLs
- Strict CORS allowlists
- Mass assignment and data exposure
- Safe error messages in production
Rate Limiting and Abuse Protection
CorePublic APIs get scraped, brute-forced and flooded, so limits protect both your users and your infrastructure bill.
- Fixed window vs token bucket
- Limits per IP, user and key
- Shared counters in Redis
- 429 with a Retry-After header
- Login brute-force protection
- Body size and timeout limits
Secrets and Configuration
CoreKeys leaked in a repo are one of the fastest routes to a breach, so keep configuration outside the code and secrets out of Git.
- Config from environment variables
- .env files only for local dev
- Cloud secret managers
- Rotating keys and tokens
- Secret scanning on repositories
- Least-privilege database users
Build: Auth for the Bookmarks API
Add signup and login with Argon2id hashes, short-lived access tokens, rotating refresh tokens in HttpOnly cookies, and admin-only routes. Rate limit the login route and write a test proving a reused refresh token is rejected.
Caching, Background Jobs and Real-Time
About 3-4 weeks
Make slow reads fast, move slow work off the request path, and push live updates to clients.
HTTP Caching
RecommendedThe cheapest request is one your server never sees, and HTTP caching headers let browsers and CDNs answer for you.
- Cache-Control directives
- ETag and If-None-Match
- 304 Not Modified responses
- Public vs private caching
- CDN caching and purging
Caching with Redis
CoreCaching hot reads in Redis takes load off the database, but it only works if you plan for invalidation and stale data.
- Cache-aside pattern
- Choosing TTLs per data type
- Invalidating on writes
- Key naming and versioning
- Preventing cache stampedes
- Measuring hit rate
Queues and Background Jobs
CoreEmails, image processing and third-party calls should not block a request, so push them to a queue and process them in workers.
- Producers, queues and workers
- BullMQ on top of Redis
- Retries with exponential backoff
- Handling permanently failed jobs
- Worker concurrency and rate limits
- Scheduled and repeating jobs
- Workers as separate processes
Webhooks and Idempotency
CorePayment and integration providers deliver events by webhook and retry on failure, so your handlers must be verifiable and safe to run twice.
- Acknowledge webhooks fast, process later
- Verifying HMAC signatures
- At-least-once delivery
- Idempotency keys on POST requests
- Deduplicating with unique constraints
- Sending webhooks with retries
Real-time with WebSockets and SSE
RecommendedChat, notifications and live dashboards need the server to push data, and the choice between polling, SSE and WebSockets affects how you scale.
- Polling vs SSE vs WebSockets
- Server-Sent Events for one-way streams
- WebSocket connection lifecycle
- Authenticating socket connections
- Heartbeats and reconnection
- Fan-out across servers with Redis
Calling External Services and AI APIs
RecommendedBackends now call payment, email and AI model APIs all the time, and those calls need timeouts and retries so one slow provider cannot take you down.
- Timeouts with AbortSignal.timeout
- Retries with backoff and jitter
- Circuit breakers for failing services
- Streaming AI model responses
- Respecting provider rate limits
- Tracking cost and token usage
Build: Link Preview Service
Add an endpoint that accepts a URL with an idempotency key, queues a BullMQ job that fetches the page title and image with timeouts and retries, and caches results in Redis. Stream job completion to the browser over Server-Sent Events.
Testing and Code Quality
About 2-3 weeks
Prove your API works with fast unit tests and realistic integration tests, and keep the codebase consistent.
Unit Testing
CoreUnit tests pin down business rules so you can refactor with confidence, and most teams expect them in every pull request.
- Node.js test runner or Vitest
- Arrange, act, assert
- Testing pure service logic
- Mocks, stubs and fakes at boundaries
- Testing error paths
- Coverage as a guide only
Integration Tests with Real Dependencies
CoreMany backend bugs live where code meets the database or the HTTP layer, so test those paths against real services instead of mocks.
- HTTP tests with Supertest
- Real PostgreSQL via Testcontainers
- Resetting data between tests
- Test data factories
- Testing protected routes
- Running test files in parallel safely
Contract and Schema Tests
OptionalWhen several services or apps depend on your API, contract tests catch breaking changes before they are deployed.
- Validating responses against OpenAPI
- Consumer-driven contracts with Pact
- Detecting breaking schema changes
- Running contract checks in CI
Linting, Formatting and Type Checks
CoreAutomated checks settle style debates and catch bugs early, leaving code review free for design and logic.
- ESLint with typescript-eslint
- Prettier for formatting
- Strict tsc checks
- Pre-commit hooks for fast checks
- Small, reviewable pull requests
Debugging Node.js
RecommendedReading stack traces and stepping through code with a debugger finds bugs far faster than scattering console.log calls.
- Reading stack traces
- node --inspect with Chrome DevTools
- Breakpoints in VS Code
- Source maps for TypeScript
- Reproducing bugs as failing tests
Build: Test Suite for the Bookmarks API
Write unit tests for the service layer and an integration suite that starts PostgreSQL and Redis in containers and hits every route with Supertest, including auth failures. Make one command run the whole suite on a clean machine.
Architecture and Scaling
About 4-5 weeks
Structure a growing codebase, reason about system design trade-offs, and find and remove performance bottlenecks.
Layered Application Structure
CoreSeparating HTTP handling, business logic and data access keeps code testable and lets you swap pieces without rewrites.
- Controllers, services and repositories
- Feature-based folder structure
- Dependency injection via constructors
- Keeping Express out of business logic
- DTOs and mapping between layers
Modular Monoliths and Microservices
RecommendedMost teams do best starting with a well-structured monolith, and knowing when a split into services is worth the cost is a key design judgment.
- Module boundaries in one codebase
- The cost of network calls
- Signs a module should split out
- API gateways and service discovery
- Data ownership per service
Event-driven Design
RecommendedPublishing events decouples parts of a system, but it trades immediate consistency for eventual consistency that you must plan for.
- Commands vs events
- Publish and subscribe
- Transactional outbox pattern
- Eventual consistency trade-offs
- Sagas for multi-step workflows
- Idempotent event consumers
Message Brokers: RabbitMQ and Kafka
OptionalLarger systems move events through a dedicated broker, and RabbitMQ and Kafka are built for different jobs.
- RabbitMQ exchanges, queues and bindings
- Acks and dead-letter queues
- Kafka topics and partitions
- Consumer groups and offsets
- Ordering and delivery guarantees
- Choosing a queue vs a log
Scaling and Connection Management
CoreHandling more traffic mostly means running more stateless copies of your app and protecting the database behind them.
- Stateless servers and shared state
- Horizontal vs vertical scaling
- Load balancing strategies
- Database connection pooling
- Read replicas for heavy reads
- Multiple Node.js processes per machine
Performance Testing and Profiling
RecommendedYou cannot fix what you have not measured, so load test first and then profile to find the real bottleneck.
- Latency percentiles: p50, p95, p99
- Load tests with k6 or autocannon
- CPU profiles and flame graphs
- Heap snapshots for memory leaks
- Monitoring event loop delay
System Design Fundamentals
RecommendedSystem design interviews and real project planning both ask you to sketch components, estimate load and justify trade-offs.
- Back-of-envelope capacity estimates
- Consistency vs availability trade-offs
- Sharding and partitioning basics
- Designing for partial failure
- Practice: URL shortener, feed, chat
Build: Modular Bookmarks Platform
Reorganize the API into users, bookmarks and notifications modules with controller, service and repository layers, where bookmark events reach notifications through an outbox table and a worker. Load test the list endpoint before and after your caching and pooling changes and record the p95 results in the README.
Shipping and Running in Production
About 3-4 weeks
Package, deploy and monitor a backend service, and know what to do when it breaks.
Docker and Containers
CoreContainers are how most backends are packaged and run, so you need to build small, secure images and a local stack with Compose.
- Images, containers and layers
- Writing a Dockerfile for Node.js
- Multi-stage builds for small images
- Running as a non-root user
- .dockerignore and build cache
- Docker Compose for local services
CI/CD with GitHub Actions
CoreAutomated pipelines run your checks on every pull request and deploy the same way every time, which teams treat as the baseline.
- Workflows, jobs and steps
- Lint, type-check and test on PRs
- Service containers for test databases
- Building and pushing images
- Deploying on merge to main
- Environment secrets and approvals
Structured Logging
CoreWhen something fails in the middle of the night, searchable JSON logs with request IDs are what let you find the cause quickly.
- JSON logs with pino
- Choosing the right log level
- Correlation and request IDs
- Never log secrets or tokens
- Shipping logs to a central store
Metrics, Tracing and OpenTelemetry
CoreMetrics tell you something is wrong and traces show where, and OpenTelemetry is the vendor-neutral standard most teams use to collect both.
- Rate, errors and duration metrics
- Traces, spans and context propagation
- OpenTelemetry Node.js auto-instrumentation
- Exporting to a collector
- Dashboards and useful alerts
- SLOs and error budgets
Cloud and Deployment Basics
CoreYou should be able to put a service online yourself and know which managed services your team's cloud offers.
- VMs vs containers vs serverless
- Managed PostgreSQL and Redis
- Object storage for files
- Regions, networking and firewalls
- IAM roles with least privilege
- Keeping an eye on costs
Reliability in Production
RecommendedHealthy services shut down cleanly, deploy without downtime and can be restored from backups, which is what on-call work relies on.
- Liveness and readiness checks
- Graceful shutdown on SIGTERM
- Rolling, zero-downtime deploys
- Tested backups and restores
- Rollbacks and feature flags
- Runbooks and blameless postmortems
Build: Production Launch
Containerize the bookmarks platform and deploy it with managed PostgreSQL and Redis through a GitHub Actions pipeline, on a custom domain with HTTPS. Add JSON logs, OpenTelemetry traces, health checks and a written rollback plan, then break something on purpose and find it through the traces.
Go deeper
Last reviewed .