Having two mechanisms with different capabilities may also be annoying, as you must always . I prefer a 4-level solution. The 1st level is tried first. On failure, the next level is tried. Every query starts at the first level again, so that one setting may be taken from the 3rd and one from the 1st level.
Every application looks for an ini-file.
The application tries to get the setting from the environment. An application can have some default settings decided at compile time, which allow the application to run even with no deployment settings. One can argue, that 2 and 3 may be exchanged, however I think that information created by a setup should have precedence over environment vars. If once the default is returned, successive calls always return this default value, even when called with different defaults. Otherwise multiple applications may collide, when both use the same name with different meanings.