Oh crap I didn’t check but you’re maximizing, not minimizing. Forget anything I said about convexity: the objective is convex indeed but it’s not very useful information. It only means the optimum will be found at a boundary of the domain.
That means there are few (if any) packages who can guarantee global optimality. And you should probably look into solvers designed for global optimization over low-dimensional spaces, rather than local ones like Ipopt. I don’t know much about best practices in that case. Basically in the convex case, best practices don’t matter as much cause everyone will find the right solution (after varying runtime).