>activitypub can't solve this on its own, but implementers of social services can for example abstract away "storage" into a separate component that runs something like solid
Part of ActivityPub standard is Client-to-server API. It is poorly specified, but by using this API one can move most of the application-specific logic to clients, and then use servers for storage (and authentication, permissions etc).
We can go even further and make data portable. This makes ActivityPub like ATProto, but much simpler and actually decentralized. You can read about implementation in this document:
https://codeberg.org/fediverse/fep/src/branch/main/fep/ef61/fep-ef61.md