deployment

  • An on-call rota of three

    A rota of two is not a rota. A third person joined in November, and the gap was everything learned in the shadowing month and never written down.

  • An incident drill on a Tuesday afternoon

    A simulated incident, announced in advance, run against production with a deliberately broken dependency. Announcing it in advance removes the value of surprise and removes the risk of…

  • A rolling update in twenty lines of shell

    Compose has no rolling update, and the thing it does not have is twenty lines of shell for a two-replica service. Scaling up, waiting for health, then removing…

  • A replica promoted during a drill, on purpose

    A failover procedure written in 2023 and executed for the first time on a Saturday in January. A runbook that has never been executed is a hypothesis, and…

  • A rota of three, and a handover note

    A third person on the rota, and the artefact that makes a weekly rotation work. Three sections and a five-minute write-up is the whole mechanism, and it is…

  • A plugin update rollback, and the failure it caught

    6.6 keeps a copy of the previous plugin version during an update and restores it if the update produces a fatal error. The rollback covers a fatal error…

  • A status page nobody had ever updated during an incident

    A status page maintained since 2022, updated eleven times, none of them during an actual outage. Putting the communication before the diagnosis feels wrong and is right —…

  • Backups restored by somebody who had never restored one

    A restore drill that had been run monthly by the person who wrote it, handed to somebody who had not. A drill run by its author verifies the…

  • Symfony 7.1, and staying on 6.4 for another year

    A second year of the same decision, revisited on schedule rather than by drift. The number going down on its own is the argument for logging deprecations rather…

  • A variable that was removed rather than deprecated

    A configuration file carried forward since 2018, containing a variable the new version refuses to start with. A refusal to start is the correct severity for an unknown…