The answer to this is quite simple: the points which are distributed on the surface come with a rotation according to the face normals automatically. So what you can do is use the Rotation output of the Distribute Points on Faces node and plug it into the Rotation input of the Instance on Points node (I used some simpler geometry for this example):
This would also work with an Align Euler to Vector node, in this case the Normal output of the Distribute Points on Faces node will be the Vector and the axis to align would be Z:
I just changed my distributed discs to cuboids as I realized it's better to show their orientation... Now for the random variations of placing the seeds it does not matter which method you used to align them with the surface.
Just between the Distribute Points on Faces (and align Euler to Vector in case you are using it) and the Rotation input of the Instance on Points node you add a Rotate Euler node set to Euler and Local. In the Rotate By socket you plug a Random Value node set to Vector for varying the rotation.
Be aware that the output of Random Value node is in Radians, i.e. a full rotation is not -180 to 180, but -Pi to Pi. So make sure to keep the values much lower in the Min/Max fields than what you want in degrees. The Z rotation will be rotating around the face normal, so a range of -Pi to Pi would be okay. The X and Y however is how much the seeds are sticking in and out of the surface, so you shouldn't use too high values there.
This is the setup if you are using the Rotation output of the Distribute Points on Faces node:
And this is the setup when using the Normal output with an Align Euler to Vector node. Notice by the way that although this works just as good as the other method, not all seeds are rotated in the same way than before. That is because with both methods the Z axis is aligned correctly to the face normals, but the X and Y rotation are different.