The lab used to run Mastodon on Kubernetes: PostgreSQL, a Redis-compatible cache, and S3-shaped media storage on top of the usual edge stack. That worked, but it was heavy for a small personal instance — more moving parts than the workload justified.
The fediverse home at this-is-fine.social now runs snac instead: a
minimal ActivityPub server in portable C, no database, all state on a single filesystem tree, backed up
off-cluster with the same VolSync + restic pattern as other stateful apps.
Why leave Mastodon?
The earlier write-up on running Mastodon in the lab listed the real cost:
| Layer | Mastodon stack | Operational weight |
|---|---|---|
| App | Mastodon (web + streaming + sidekiq) | Large images, many processes |
| SQL | CloudNative-PG | Cluster, backups, upgrades |
| Cache | Dragonfly (Redis API) | Extra Deployment, TLS to cache |
| Media | Rook RGW / object storage | Buckets, credentials, S3 quirks |
| Edge | Gateway API, cert-manager, DNS | Still required for federation |
For a handful of local users and light federation, that is a lot of infrastructure to babysit. Mastodon is excellent software; it is simply bloated relative to “I want a fediverse account on my own domain without running a small SaaS platform.”
What snac changes
snac (“Social Networks Are Crap”) is deliberately small:
- No PostgreSQL, no Redis, no object store — posts, follows, and media live under one data directory.
- ActivityPub federation to Mastodon, Pleroma, and friends; optional Mastodon API so many client apps still work.
- Hard-link–friendly on-disk layout (documented in
snac(8)); backups must preserve that (tar/rsync-H).
The lab builds a container from images/snac/ (Alpine, snac httpd via a small entrypoint). A PVC mounts at
/snac/data; Gateway API and TLS stay the same story as in the Envoy Gateway post.
Internet
-> this-is-fine.social (HTTPRoute)
-> snac (Deployment, port 8001)
PVC: server.json, users/, media/ (one tree)
-> VolSync restic -> remote repository
Backups without a database dump
Stateful Mastodon meant CNPG backups plus optional PVC copies. With snac, the backup surface collapses to the PVC:
- Include
k8s/templates/volsync/in the snac app Kustomization (same as VolSync article). - Point the Deployment volume at the template’s
claimName. - Let the restic mover snapshot and push encrypted data to the shared remote repo.
Restic sees a consistent filesystem snapshot; there is no separate “media bucket” or SQL dump to coordinate. Restore is
“recover the PVC tree, start snac httpd,” respecting hard links on restore.
Account migration (Mastodon -> snac)
snac documents a Mastodon-to-snac move in snac(8) (since 2.61). In short:
- On the old Mastodon account, export follows, lists, blocks, and bookmarks (CSV).
- Copy the CSV files into the snac user’s
import/directory and runsnac import_csv. - Run
snac aliasto tie the new snac user to the old@[email protected]handle. - On Mastodon, use Move to a different account and point followers at the snac handle.
The upstream manual and fedi.tips migration guide are worth reading before you cut traffic — federation moves depend on remote servers cooperating.
Tradeoffs
snac is not a drop-in replacement for every Mastodon feature. Lists, moderation tooling, and admin UX are thinner; the web UI is simple by design. For this lab that is acceptable: less software, fewer night pages, same domain on the fediverse.
GitOps layout (Flux overview) is unchanged — only the application bundle
under k8s/applications/ swapped from the Mastodon Helm release to a slim snac Deployment. The heavy chart stack can
stay retired unless something else needs it.
Further reading: snac README, ActivityPub, prior Mastodon lab stack.