Do the SQL database tables for Hangfire grow forever or is there a built-in purge mechanism (for completed or too old jobs) or maybe an optional configuration for that?
There is a thing final state in Hangfire. When a background job is moved into a final state, the internal state machine sets an expiration time for it (defaults to 1 day, you can change it). Succeeded and Deleted states are declared as final ones. Expired jobs are deleted automatically, there is ExpirationManager process (you can search for its implementation in GitHub repository), which deletes expired jobs in batches of 1000 records at once.