Your second Server Fault link outlines what is required. Routed prefix to you, local route on that host, and allow non local IP in socket also known as IP_FREEBIND. EADDRNOTAVAIL implies step three is incomplete.
Confirm your routed prefix and local route works by pinging an IP in it from a different IPv6 network.
On Linux, allow bind to other IPs by creating /etc/sysctl.d/freebind.conf
containing
net.ipv4.ip_nonlocal_bind = 1
net.ipv6.ip_nonlocal_bind = 1
Applications should bind to a desired IP address. Otherwise if not provided, the usual source address selection would pick some local IP assigned to an interface. Also possible to set IP_FREEBIND option on a per socket level.
Note that even without this routed prefix trick, a large number of IP addresses can be assigned to a host. Possibly several thousand before neighbor discovery becomes a problem.
IPv6 subnets should be /64 in size. Standardizing on lower half interface ID, upper half aggregation for routing. As router, this host might still be routed a /48, but only needs a /64 on the loopback route to itself.
Number of IP addresses is not important, as 2^64 is already effectively unlimited in size. Perfectly fine to only use one or two /64s out of a /48, leave room in the address plan for other things.