What I feel is missing from the practical suggestions section: why cache images at all? They should be stored on the server they were uploaded to, and nowhere else. The image URL would be attached to the post, and could then be used by clients to fetch the image from the original server.
I thought lemmy did this, but it seems not (any more?).
p2p from behind a CGNAT works just fine as long as a single server is accessible and can mediate connections between other peers. Most non-servers are behind some sort of NAT these days.