<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Dylan Summerville – Blog</title>
    <link>https://dylansummerville.com/blog</link>
    <atom:link href="https://dylansummerville.com/blog/feed.xml" rel="self" type="application/rss+xml"/>
    <description>Working notes from building and running production systems: DevOps, infrastructure as code, containers, databases, automation and security.</description>
    <language>en-au</language>
    <lastBuildDate>Thu, 29 Oct 2026 14:20:00 +1100</lastBuildDate>
    <item>
      <title>Thirteen minutes of CI: what 17,700 tests are for</title>
      <link>https://dylansummerville.com/blog/thirteen-minutes-of-ci</link>
      <guid isPermaLink="true">https://dylansummerville.com/blog/thirteen-minutes-of-ci</guid>
      <pubDate>Thu, 29 Oct 2026 14:20:00 +1100</pubDate>
      <description>Every change runs about 17,700 tests in thirteen minutes before it merges. Why the slow check stays, and the merge rule I broke today.</description>
      <category>CI</category>
      <category>Testing</category>
      <category>Postgres</category>
      <category>Practice</category>
    </item>
    <item>
      <title>Containerising JAS: every store on two databases, late October 2026</title>
      <link>https://dylansummerville.com/blog/containerising-jas-every-store-on-two-databases</link>
      <guid isPermaLink="true">https://dylansummerville.com/blog/containerising-jas-every-store-on-two-databases</guid>
      <pubDate>Thu, 29 Oct 2026 06:40:00 +1100</pubDate>
      <description>Every store now writes to SQLite and Postgres, the first soak day was clean, and the read switch is rehearsed. What turned up, and what comes next.</description>
      <category>PostgreSQL</category>
      <category>Migration</category>
      <category>Databases</category>
      <category>Progress</category>
    </item>
    <item>
      <title>Shadow writes slowed a job by a third: measuring it and fixing it</title>
      <link>https://dylansummerville.com/blog/shadow-writes-slowed-a-job-by-a-third</link>
      <guid isPermaLink="true">https://dylansummerville.com/blog/shadow-writes-slowed-a-job-by-a-third</guid>
      <pubDate>Thu, 29 Oct 2026 06:30:00 +1100</pubDate>
      <description>A job slowed by a third under dual writes to SQLite and Postgres. Measuring it against a control, the per-row round trips behind it, and the batching fix.</description>
      <category>PostgreSQL</category>
      <category>Performance</category>
      <category>Databases</category>
      <category>Migration</category>
    </item>
    <item>
      <title>Rehearsing a database read switch, and a rollback that has to repair something</title>
      <link>https://dylansummerville.com/blog/rehearsing-a-database-read-switch</link>
      <guid isPermaLink="true">https://dylansummerville.com/blog/rehearsing-a-database-read-switch</guid>
      <pubDate>Thu, 29 Oct 2026 06:20:00 +1100</pubDate>
      <description>Moving reads from SQLite to Postgres: identity sequences that fall behind, a seven-second switch window, and a rollback rehearsed with a deliberate fault.</description>
      <category>PostgreSQL</category>
      <category>Migration</category>
      <category>Databases</category>
      <category>Reliability</category>
    </item>
    <item>
      <title>Moving a live WordPress site into containers without downtime: the plan</title>
      <link>https://dylansummerville.com/blog/wordpress-to-containers-without-downtime</link>
      <guid isPermaLink="true">https://dylansummerville.com/blog/wordpress-to-containers-without-downtime</guid>
      <pubDate>Fri, 23 Oct 2026 17:45:00 +1100</pubDate>
      <description>My plan for moving a WordPress site from shared hosting into containers behind Cloudflare: two stages, scripted gates, no downtime and no broken links.</description>
      <category>WordPress</category>
      <category>Migration</category>
      <category>Cloudflare</category>
      <category>Containers</category>
    </item>
    <item>
      <title>Containerising JAS: where it stands, October 2026</title>
      <link>https://dylansummerville.com/blog/containerising-jas-progress-october-2026</link>
      <guid isPermaLink="true">https://dylansummerville.com/blog/containerising-jas-progress-october-2026</guid>
      <pubDate>Thu, 22 Oct 2026 18:30:00 +1100</pubDate>
      <description>Progress on containerising the Job Adding System: Postgres shadow writes in production, stores moving in waves, and the container half still to come.</description>
      <category>Containers</category>
      <category>PostgreSQL</category>
      <category>Migration</category>
      <category>Progress</category>
    </item>
    <item>
      <title>Shadow writes: proving a database move before anything depends on it</title>
      <link>https://dylansummerville.com/blog/shadow-writes-nightly-compare</link>
      <guid isPermaLink="true">https://dylansummerville.com/blog/shadow-writes-nightly-compare</guid>
      <pubDate>Thu, 22 Oct 2026 18:30:00 +1100</pubDate>
      <description>A database migration you can prove: one helper for every store, writes to both databases, a nightly compare and a read verifier, then a clean week.</description>
      <category>Databases</category>
      <category>PostgreSQL</category>
      <category>Migration</category>
    </item>
    <item>
      <title>Building a container image I&#x27;d trust in production</title>
      <link>https://dylansummerville.com/blog/container-image-i-would-trust</link>
      <guid isPermaLink="true">https://dylansummerville.com/blog/container-image-i-would-trust</guid>
      <pubDate>Thu, 22 Oct 2026 18:30:00 +1100</pubDate>
      <description>The rules behind a production Python container image: a digest-pinned base, wheels only and no compiler, a minimal runtime, a non-root user, audits.</description>
      <category>Containers</category>
      <category>Docker</category>
      <category>Security</category>
    </item>
    <item>
      <title>Moving 30 SQLite databases to Postgres without losing a record</title>
      <link>https://dylansummerville.com/blog/sqlite-to-postgres-migration</link>
      <guid isPermaLink="true">https://dylansummerville.com/blog/sqlite-to-postgres-migration</guid>
      <pubDate>Sun, 18 Oct 2026 19:30:00 +1100</pubDate>
      <description>How a 125-hour SQLite to Postgres migration became about 21 hours of my time: pgloader, scripted fixes, dual writes and a week of nightly compares.</description>
      <category>Databases</category>
      <category>PostgreSQL</category>
      <category>SQLite</category>
      <category>Migration</category>
    </item>
    <item>
      <title>Docker Best Practices</title>
      <link>https://dylansummerville.com/blog/docker-best-practices</link>
      <guid isPermaLink="true">https://dylansummerville.com/blog/docker-best-practices</guid>
      <pubDate>Thu, 15 Oct 2026 17:46:00 +1100</pubDate>
      <description>Dockerfile best practices: pin base images by digest, prefer slim over Alpine, order layers for caching, build multi-stage, run as non-root and scan weekly.</description>
      <category>Containers</category>
      <category>Docker</category>
      <category>Dockerfiles</category>
      <category>CI</category>
    </item>
  </channel>
</rss>
