Web app development
The parts nobody sees become urgent the first time nobody can release or recover them.

The short answer
A sound backend keeps business rules, data and external dependencies understandable, while the infrastructure makes releases repeatable and failure recoverable. Use separate environments, automate builds and migrations, back up data with tested restores, monitor user-facing behaviour and keep the repository, cloud accounts, domains and credentials under the client's control.
A backend can appear healthy because the screens still load. The real quality shows up when data changes shape, an external service fails, a release needs to be reversed or a new team has to understand why the system works the way it does. Infrastructure is the set of decisions that makes those moments ordinary instead of dramatic.
Make ownership visible before choosing the architecture.
The client should control the source repository, cloud organisation, domains, databases and the accounts used for consequential external services. A delivery team can administer them, but the legal owner and recovery path should not depend on a personal account or a supplier that may change.
Create access by role and keep an inventory of what exists. The person deploying code does not need the same permissions as the person changing billing or domain ownership. Shared credentials feel convenient until someone leaves and nobody knows where they were copied.
Architecture should fit the load, data, maintenance team and cost tolerance the product actually has. Starting with several services because a diagram looks mature creates more releases, permissions and failure paths before the product has earned them. Start with the simplest shape that protects the important boundaries and record what would justify changing it.
Separate environments so testing cannot become production work.
Local development, shared testing and production have different jobs. They should use the same repeatable setup while keeping data, credentials and external side effects separate. A test should not email a real customer, charge a real card or write into the production system because an environment variable was copied carelessly.
Infrastructure configuration belongs in version control where practical. A new environment should come from reviewed configuration and documented secrets, not from one person's memory of which boxes they clicked. That makes disaster recovery, handover and ordinary change easier to reason about.
1. Describe the environments
Write what local, testing and production are for, which data may appear in each and which external systems are real, simulated or disabled.
2. Automate the build
Turn a version of the code into the same deployable result every time. Keep the commands and dependencies with the repository.
3. Apply data changes deliberately
Version database changes, test them against representative data and include a safe response when a change cannot be reversed automatically.
4. Prove the release path
Deploy to testing, run the important checks, approve the release and confirm production health through the same documented sequence.
Backups are only real after a restore succeeds.
A provider saying backups are enabled does not settle how much data can be lost, how long recovery takes or whether the application can use the restored copy. Define those expectations against the business. A reporting system and a live operational platform can tolerate different gaps and recovery windows.
Test restores into a separate environment. Confirm that files, database records and the configuration needed to interpret them are included. Keep enough history to recover from a mistake discovered days later, not only from a failure noticed immediately.
Data deletion and retention need the same care. Decide what is removed, what must remain for an accountable record and how a deletion flows into connected systems. A backup should not quietly become a permanent copy of information the product claims to have deleted.
| Promise | Evidence to request | Decision it supports |
|---|---|---|
| We have backups | A recent restore test and the data included | How much work can be recovered |
| Deployments are automated | A repeatable release from a known commit | Whether delivery depends on one person |
| The system is monitored | Alerts tied to failed user tasks and owners | Who notices and responds |
| The client owns it | Repository, cloud and domain access in the client organisation | Whether another team can take over |
Monitor the work users depend on, not only the machines.
CPU and memory can look normal while sign-ins fail, a queue stops moving or an integration rejects every update. Technical signals help diagnose a problem. Product signals tell you that a problem exists. Monitor the completion and latency of the tasks the business cannot afford to lose.
Every alert needs a threshold, an owner and a first response. If every warning reaches everyone, the important one becomes background noise. Route the alert to the person who can act and include the release, request or trace information they need to investigate without starting from a blank dashboard.
Keep logs useful and proportionate. Record enough context to understand the event, but avoid credentials and sensitive content. Set retention deliberately so logs remain available long enough to investigate without becoming an unmanaged copy of the product's data.
A safe release includes a way back.
Small releases reduce the amount that can fail at once. Use automated checks before deployment, then confirm the important tasks on production without relying on a customer to report the first problem. Separate releasing code from exposing a consequential feature when a gradual rollout or internal check reduces risk.
Rollback is not always a button. Code may return to an earlier version while a data change cannot. Plan the response for both before applying a migration. Sometimes the safest answer is a forward fix, a temporarily disabled feature or a preserved copy of the affected records.
We document the release and recovery path as part of the build. The practical test is whether another capable engineer can follow it with the access and information provided. If the answer is no, the infrastructure still contains an undocumented dependency.
Review the operating cost and ownership at the same time. A service may be technically appropriate and still be the wrong choice when nobody can explain its bill, renewal, support path or exit. The owner should know which parts scale with use and which remain fixed before an unexpected invoice becomes the first architecture review.
Worth knowing before you start
Keep the repository, cloud organisation, domains and consequential service accounts under client ownership.
Ask for a restore demonstration, not a screenshot showing that backups are enabled.
Tie monitoring to sign-in, queues, integrations and other user-facing work as well as machine health.
Record the response to a failed data migration before the migration reaches production.
Related work
Common questions
Usually one understandable application, one primary database, separate testing and production environments, repeatable deployment, backups with a tested restore, monitoring and client-owned accounts. Add architectural parts when a real load, team or reliability requirement justifies them, not to make the first diagram look advanced.
Test often enough that the restore process, credentials and data shape have not drifted since the last attempt, and after consequential infrastructure or database changes. The right schedule depends on how much data the business can lose, but an untested backup should not be treated as recovered data.
Include machine health, application errors, response time and the business tasks that matter: sign-in, queue processing, integration events, scheduled work and core transactions. Each alert needs an owner and an agreed response. A dashboard nobody watches is not an operating process.
It contains client-owned access, an inventory of services and domains, environment setup, deployment and rollback instructions, backup and restore procedures, monitoring ownership, external dependencies, current risks and the architecture decisions that would otherwise live only in one engineer's memory.
Related
Want to talk through your situation?
A short call is usually enough to tell whether this is the right work for you. If it isn’t, we’ll say so.