010. Ship a container image, not a binary

Status: accepted

Context

A single static binary is the nicest deployment story: scp it and run. That is what the project aimed for.

Decision

Ship a container image.

Why

liblogosdelivery requires glibc 2.38. Our own Go binary only needs 2.34, but the library does not, and that decides it:

targetglibcworks?
Debian 122.36
Ubuntu 24.042.39
Ubuntu 25.102.42

A tarball therefore fails on the most common VPS image. Static linking is not available either: building liblogosdelivery from source is blocked upstream (the Nim build fails with illegal effect: NestedPoll at both master and the revision the Android bindings pin), so we cannot control how it is linked.

The image also carries the 21 shared libraries Basecamp ships alongside it — which matters, because the library dlopens libpq at runtime for its Store backend, and that failure is fatal and only visible at startup.

Consequences

What would change our mind

Upstream fixing the Nim build, which would let us build the library ourselves and consider static linking — or a liblogosdelivery built against an older glibc.