How to show labels exactly around a circle in QGIS?

In brief

You should split each circle in 2 halves, then convert them to polyline (or any mean to mimic the top and bottom halves perimeters). The main thing is to have at the end a layer with the top perimeter and the bottom perimeter.

Then you label the top one with a curve labeling with a top setting and label the bottom one with a bottom labeling.

Below the How-to-do with screen shots

The table of your entities should look like this (it's a test example, it's going to be different with your data). I created a position field and a label field here.

Table

In the case where you keep one physical layer, you duplicate your layer and set the filter to match 'UP' for a copy of the layer and 'DOWN' for the other (tip : when somebody will have set this property in the data defined field this will be simpler)

Filter

It should look like this in the properties :

properties query builder

For each, you set up different labeling properties

Below layer

Below

Upper layer

Upper

then you get :

Curvy