Except for video transcoding, a PeerTube instance is not CPU bound. Neither Nginx, PeerTube itself, PostgreSQL nor Redis require a lot of computing power. If it were only for those, one could easily get by with just one thread/vCPU.
You will hugely benefit from at least a second thread though, because of transcoding. Transcoding is very cpu intensive. It serves two purposes on a PeerTube instance: it ensures all videos can be played optimally in the web interface, and it generates different resolutions for the same video. PeerTube support for offloading transcoding to other machines is <a target="_blank" rel="noopener noreferrer" href="https://github.com/Chocobozzz/PeerTube/issues/947">being discussed</a>, but not yet implemented.
1/2 GB of RAM should be plenty for a basic PeerTube instance, which usually takes at most 150 MB in RAM. The only reason you might want more would be if you colocate your Redis or PostgreSQL services on a non-SSD system.
There are two important angles to storage: disk space usage and sustained read speed. To make a rough estimate of your disk space usage requirements, you want to know the answer to three questions:
Do you want to enable transcoding? If so, do you want to provide multiple resolutions per video? Try this out with a few videos and you will get an idea of how much extra space is required per video and estimate a multiplication factor for future space allocation.
In terms of read speed, you want to make sure that you can saturate your network uplink serving PeerTube videos. This should not be a problem with SSD disks, whereas traditional HDD should be accounted for: typical sustained read rates for a well tuned system with a 7200rpm hard disk should hover around 120 MB/s or 960 Mbit/s. The latter should be enough for a typical 1 Gbit/s network uplink.
A rough estimate of a traditional server's video streaming network capacity is usually quite straightforward. You simply divide your server's available bandwidth by the average bandwidth per stream, and you have an upper bound.
Take a server for example with a 1 Gbit/s uplink for example pushing out 1080p60 streams at 5 Mbit/s per stream. That means the absolute theoretical upper capacity bound is 200 simultaneous viewers if your server's disk i/o can keep up. Expect a bit less in practice.
But what if you need to serve more users? That's where PeerTube's federation feature shines. If other PeerTube instances following yours, chances are they have decided to mirror part of your instance! The feature is called "server redundancy" and caches your most popular videos to help serve additional viewers. While viewers themselves contribute a little additional bandwidth while watching the video in their browsers (mostly during surges), mirroring servers have a much greater uplink and will help your instance with sustained higher concurrent streaming.
Bandwidth: can be mitigated using <a target="_blank" rel="noopener noreferrer" href="https://docs.joinpeertube.org/admin-following-instances?id=instances-redundancy">PeerTube redundancy system</a> and cache servers that serve video static files in front of your PeerTube instance
Storage: can be mitigated using <a target="_blank" rel="noopener noreferrer" href="https://docs.joinpeertube.org/admin-remote-storage">S3/Object storage</a>
Video transcoding: we may implement <a target="_blank" rel="noopener noreferrer" href="https://github.com/Chocobozzz/PeerTube/issues/947">transcoding by remote workers</a> in the future
If you notice performance problems or a bottleneck at your scale, don't hesitate to <a target="_blank" rel="noopener noreferrer" href="https://github.com/Chocobozzz/PeerTube/issues/new/choose">create an issue</a> to discuss it.