deployment

  • buildx, and an image for two architectures

    Apple Silicon arrived in November and a team suddenly has two architectures, which means an image built on a laptop may not run on the server. The arm64…

  • Draining a node on a Wednesday afternoon, on purpose

    A failover that has never been exercised is a procedure nobody has tested, and the first execution is always during an incident with an audience. Every one of…

  • The maintenance mode secret, and the bypass cookie

    Putting a site into maintenance mode used to lock out the people deploying it as well, so the usual workaround was an IP allowlist that had to be…

  • Docker secrets are files, not environment variables

    A secret in an environment variable is visible in docker inspect, in the process environment and in any crash dump that prints the environment. The _FILE convention is…

  • Blue-green on one host is two sockets and a variable

    The pattern does not need two machines or a load balancer — two php-fpm pools and an nginx variable will do it, and the rollback becomes a config…

  • Draining a node before deploying to it

    Deploying to a host still receiving traffic means the requests in flight during the swap see a half-updated application, and there is no version of that which is…

  • Ubuntu 20.04 and the netplan that is now normal

    20.04 arrived in April and netplan is no longer the new thing — which means the older configuration people still copy from notes does nothing at all. netplan…

  • An API document that is generated, not maintained

    The documentation was written in January and the API changed in March. Documentation written by hand is a copy, and copies drift — usually within a sprint.

  • Backups, restores, and the number nobody had measured

    The dump had run nightly for two years and had never been restored. A successful exit code is not a successful backup, and nobody could say how long…

  • Blue-green on one host is two directories and a symlink

    The pattern does not require two machines or a load balancer — two upstreams and an nginx variable will do it, and the rollback becomes a config reload.…