AppExpertly
Trust

Infrastructure and Dependency Management

How our applications are built, what they are built from, how they reach production, and how they come back when a release is wrong.

Last updated 9 September 2026 · Reviewed annually

1. Scope

The build, supply chain and deployment path for every application AppExpertly publishes.

2. Reproducible builds

Every version is pinned. The package manager, the language runtime and every dependency are fixed rather than floated. Installs run from a committed lockfile in a mode that fails if the lockfile and the manifest disagree, so a build cannot quietly resolve a different tree from the one that was reviewed.

This is what makes an advisory actionable. A dependency audit is only useful if the version it reports is the version actually deployed.

Container base images are pinned to a major version and a distribution rather than to a moving tag.

3. What must pass before a change lands

Every change is typechecked, built and tested in continuous integration. The deployment pipeline runs the same checks again rather than trusting the earlier result.

A failing check blocks the deployment. It does not warn and proceed.

4. Deployment

Deployments run from continuous integration, never from a developer's machine.

Cloud credentials are issued per run and expire with it. No long-lived cloud access keys exist for deployment, which removes the most commonly leaked credential class from the estate entirely.

Application images are built in CI, tagged by the commit that produced them, and pushed to a private registry. The commit tag is what makes a rollback unambiguous: the previous image is a specific commit rather than whatever happened to be there before.

Static front ends are published to object storage behind a CDN, with content-hashed assets served as immutable and entry documents served uncached, so a deploy cannot leave a stale document pointing at assets that no longer exist.

5. Rollback

A rollback is a first-class operation with its own pipeline, not an emergency improvisation. It redeploys a previously published image by tag and needs no rebuild, so it is available even when the thing that is broken is the build itself.

Rollback is the first containment action considered during an incident. See Incident Management and Response.

6. Databases and migrations

Schema migrations are generated, committed and reviewed like any other change, and applied as an explicit deployment step. They never run automatically at application start, because a process that migrates on boot will migrate when it restarts, including when it restarts unexpectedly.

Migrations that cannot be reversed by a subsequent migration are identified as such, and the recovery path for those is a restore rather than a down-migration.

7. Environments and network posture

Managed services are preferred where they exist, so that patching the underlying engine is the provider's responsibility rather than a task we might forget.

Databases accept connections only from an allowlisted network, never from the open internet, and require TLS. Caches and queues are reachable only on an internal network. Each application exposes a single inbound port, terminated at a reverse proxy that holds the certificate. Background workers expose nothing.

8. Backups

Logical dumps run on a schedule and are stored separately from the running system, so a restore does not depend on the health of the instance that produced them. The restore procedure is documented with exact commands and is treated as part of the backup rather than an afterthought to it.

9. Dependency changes

A dependency is added when it carries real weight, and preferred over a hand-written substitute for anything security-relevant such as cryptography or signature verification.

Updates are applied as deliberate changes with the full check suite behind them. Security updates take priority and follow the timings in Vulnerability Management.

Automated dependency and static analysis scanning in CI is in progress. Auditing is performed at the point of a dependency change and before a release until it lands. This is stated rather than claimed as already running.