@monthly cron job is not reliable
Too many moving pieces and consequently options to consider. But problem 1 means you need some form of external way to track success (otherwise one option would have been for your server task - say a bash script - to keep retrying N times and sleeping in between retries, until the report generation is successful).
If you want a full-blown solution you can use for many different future needs, you can look into the available third party schedulers like Jenkins or SOS Berlin.
If you are looking for a simpler solution, you can schedule the report script via cron to run many times (say every hour for a few days at the end of the month), then have it keep track of whether the report was generated and sent successfully (this could be as simple as creating a file and checking for its existence, or writing a value to a database).
Our customer wants us to create a report every month.
In the past, we used a @monthly cron job for this task.
But this is not reliable:

The server could be down in this minute. Cron does not re-run those jobs
If the server is up, the database could be unreachable in this moment.
If the server is up and DB is up, there could be a third party system which is not reachable
There could be a software bug.

What can I do, to be sure that the report gets created monthly?
It is a Django based web application