... just to clarify: I consider any of the configuration alternatives I
suggested a breaking change... i.e. it's not an "all batteries included"
approach that up until now Fineract propagated...

Agree with your (@Arnold, @Kristof) suggested step by step replacement...
would be also unfair to current users to rip everything apart at once.

Cheers

On Mon, Sep 16, 2024 at 12:17 PM Arnold Galovics <galovicsarn...@gmail.com>
wrote:

> Hey guys,
>
> I tend to agree with Kristof here.
>
> I also have a similar xp like him and Spring Cloud Config on brochure
> looks really good but when using it, there's the extra complexity.
>
> I'd go even further what Kristof just outlined, bringing another pain
> point we had with it. Bean reloading. As you said Aleks, you can totally
> modify the configuration runtime and it'll be picked up by the
> applications. But, it's not always that easy. Whenever we "hack" something
> in Spring or just not use it according to their suggestions, it can break
> during reloading, or doesn't even reload beans with the new configurations.
> This can lead to sleepless nights of investigating something that really
> isn't there but occurs when changing the configurations runtime.
>
> I think we all can agree that Fineract has some "nasty" Spring stuff that
> we're not proud of and will eventually break some of Spring Cloud
> Config's offerings.
>
> I'd suggest going step-by-step.
> 1. Let Adam's PR in, so we have better support for Global Configs.
> 2. Start decommissioning Global Configs and move them into application
> properties.
> 3. As soon as everything is in application properties. Remove Global
> Configurations entirely and propose a migration path for existing users.
> 4. Only here, let's think about Spring Cloud Config - don't introduce it,
> but start the discussion.
>
> Hope that makes sense.
> Best,
> Arnold
>
>
> On Mon, Sep 16, 2024 at 11:43 AM Kristof Jozsa <kristof.jo...@gmail.com>
> wrote:
>
>> We used Spring Cloud Config extensively in the past on a project. Having
>> the config audit trail is incredibly useful indeed, but we shouldn't
>> underestimate the additional infrastructure complexity required for this
>> solution. There were 2 primary concerns:
>> - local development
>> - keeping environment configurations in a separate repository
>>
>> Speaking up for the developers, there always should be an easy way to run
>> Fineract locally from our IDEs, without any additional tricking, without
>> packaging to docker or running a git server, running a spring cloud config
>> server, etc. Developing Fineract as a daily base is slow enough as it is
>> (working on it though..), so I think we should avoid any additional
>> complexity or slowdowns to local development.
>>
>> The other concern was that we kept the configurations in a separate git
>> repo (to avoid creating subtrees or other git-fu), and maintaining
>> configurations there was noticeably more cumbersome.
>>
>> I think a hybrid approach could be ideal, where the application is
>> configured locally with the right spring profile, and uses config server
>> for the real environments.
>>
>> Kristof
>>
>>
>> On Mon, Sep 16, 2024 at 12:11 AM Aleksandar Vidakovic <
>> chee...@monkeysintown.com> wrote:
>>
>>> ... @Ádám Sághy <adamsa...@gmail.com> concerning sync/consistency
>>> across instances: not a problem if we use the best practices tools like
>>> ConfigMaps (if we are in Kubernetes) or Spring Cloud Config (could also be
>>> used in a Kubernetes environment, but doesn't require one like ConfigMaps).
>>> One thing that is really neat with Spring Cloud Config is the support to
>>> use a Git repository to hold all your configurations (aka
>>> application.properties). Changes are propagated immediately and you have a
>>> "natural" audit trail of any changes that are made where as config changes
>>> in a database table are "destructive" (read: when you overwrite a config
>>> entry in a database table there will be no trace of the previous value)...
>>> so, the Git backed configs give you even an easy "rollback" in case
>>> something goes wrong.
>>>
>>> For more convincing see:
>>> https://docs.spring.io/spring-cloud-config/docs/current/reference/html/
>>>
>>> ... but even if you run your multiple Fineract instances with "plain"
>>> Docker containers and maybe with Docker Compose (for convenience) then you
>>> can just create 1 application.properties file outside of the Docker images
>>> (aka copy the original one and save it to the file system); then apply
>>> changes as necessary for your deployment and finally mount the same
>>> application.properties file from the local file system into the running
>>> Docker containers... and if each container runs on a different physical
>>> machine then just create a shared volume that contains the
>>> application.properties... voila, all instances have the same configuration.
>>>
>>> Aleks
>>>
>>> On Sat, Sep 14, 2024 at 3:18 AM James Dailey <jamespdai...@gmail.com>
>>> wrote:
>>>
>>>> Cool Adam. Thanks Alexander for your thoughts too.
>>>>
>>>>  I personally don’t have any deep insights into this, but I would ask:
>>>>  would the developer (future Adam) a year from now be happy with this
>>>> choice?
>>>>
>>>> I do remember the past debates about abstraction of configuration and
>>>> initially it was all in text files, which had to be carefully edited in xml
>>>> but was human readable.
>>>>
>>>> So incrementally better is fine with me, as long as it makes things
>>>> more maintainable than before.
>>>>
>>>> I also don’t get the concern about different layers of configuration as
>>>> long as the layering has clear inheritance and ordering.
>>>>
>>>> Thanks,
>>>> James
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Fri, Sep 13, 2024 at 10:43 AM Ádám Sághy <adamsa...@gmail.com>
>>>> wrote:
>>>>
>>>>> Hi Aleks,
>>>>>
>>>>> Thank you for sharing your thoughts!
>>>>>
>>>>> I believe your ideas have merit, and many could positively impact the
>>>>> project. However, I don't think the implementation is as straightforward.
>>>>> If these configurations are managed externally, they need to be synced and
>>>>> updated across all running instances; otherwise, we risk inconsistencies
>>>>> between them. Additionally, the time required for synchronization across
>>>>> instances should be considered.
>>>>>
>>>>> Please don't misunderstand—I'm not a big fan of the current situation
>>>>> where we have:
>>>>>
>>>>>    - Global configurations in the database
>>>>>    - Configuration in application.properties
>>>>>    - Configuration in the tenant store database
>>>>>
>>>>> I definitely agree that the latter two should be merged, and we should
>>>>> move away from the third option.
>>>>>
>>>>> However, I’m still uncertain about the first one due to the challenges
>>>>> of synchronization and consistency across running instances. That said, 
>>>>> I’m
>>>>> open to being convinced.
>>>>>
>>>>> In the long term, I agree that we should invest time and effort into
>>>>> implementing the changes you've suggested. For now, though, I was aiming 
>>>>> to
>>>>> take a smaller step toward resolving a current issue that's causing
>>>>> problems and providing a better way to manage global configurations.
>>>>>
>>>>> Best regards,
>>>>> Adam
>>>>>
>>>>> On 13 Sep 2024, at 18:57, Aleksandar Vidakovic <
>>>>> chee...@monkeysintown.com> wrote:
>>>>>
>>>>> Hi Adam,
>>>>>
>>>>> ... my question would be: why do we need this service (read: rhetoric
>>>>> question)? I know that the initial idea here was to introduce the
>>>>> capability to change configuration without any downtime... but is it 
>>>>> really
>>>>> that useful? I think:
>>>>> - it's confusing to have 2 different configuration concepts (actually
>>>>> 3 if we consider the tenant configuration database)... there is
>>>>> application.properties, the global configuration service... and the tenant
>>>>> configuration
>>>>> - nowadays there are better concepts to get the same functionality if
>>>>> not better functionality (Kubernetes Config Maps, Spring configuration
>>>>> server...)
>>>>> - changing configuration is/can be a delicate process... that's why
>>>>> the Spring people reload the whole application context if the 
>>>>> configuration
>>>>> changed... for a reason I think
>>>>>
>>>>> Just imagine you are a devops person and want to set up Fineract for
>>>>> production in a reproducible way... maybe with Terraform... Ansible... 
>>>>> bash
>>>>> scripts... doesn't really matter. Alright, so you take care of
>>>>> application.properties (or the environment variables... boils down to
>>>>> pretty much the same), but now suddenly you have to switch context from a
>>>>> file (application.properties) to your database (and wait until it's
>>>>> available etc. etc.) and additionally poke values into the database (plain
>>>>> sql statements? with liquibase?...) to make your production environment
>>>>> work (I know that people use the web UI to do this manually... well, I'd
>>>>> argue that that's not devops).
>>>>>
>>>>> BTW: same argument applies to the tenant configuration DB... should
>>>>> also be defined in application.properties
>>>>>
>>>>> In short: instead of dragging that global config service around, why
>>>>> not make an effort and move configuration related stuff into a single
>>>>> source of truth, application.properties and get rid of the service
>>>>> entirely? And while we are at it we should do the same with tenant
>>>>> configuration (or at least offer it as an optional way of running your
>>>>> Fineract).
>>>>>
>>>>> Cheers
>>>>>
>>>>> On Fri, Sep 13, 2024 at 6:16 PM Ádám Sághy <adamsa...@gmail.com>
>>>>> wrote:
>>>>>
>>>>>> Dear Fineract Community,
>>>>>>
>>>>>> I would like to bring your attention to my recent PR:
>>>>>> https://github.com/apache/fineract/pull/4057. I would greatly
>>>>>> appreciate your feedback and thoughts on the matter.
>>>>>>
>>>>>> Historically, global configurations were introduced into the system
>>>>>> via Flyway (up to version 1.6) and later through Liquibase scripts. In 
>>>>>> many
>>>>>> cases, the ID field value was explicitly defined, effectively hardcoding 
>>>>>> it.
>>>>>>
>>>>>> Currently, the global configuration API provides the following
>>>>>> capabilities:
>>>>>>
>>>>>>    - Fetching entries by ID
>>>>>>    - Fetching entries by name (this functionality was previously
>>>>>>    introduced)
>>>>>>    - Updating entries by ID only
>>>>>>
>>>>>> *This PR adds the ability to update global configuration entries by
>>>>>> name*.
>>>>>>
>>>>>>
>>>>>>    - Since the name field is unique for each global configuration,
>>>>>>    it serves as an ideal candidate for identifying entries.
>>>>>>
>>>>>>
>>>>>> *Additionally, this PR modifies the integration tests, changing the
>>>>>> retrieval and updating of global configurations to rely solely on the 
>>>>>> entry
>>>>>> name*.
>>>>>>
>>>>>>
>>>>>>    - This change improves readability and helps prevent issues
>>>>>>    caused by ID changes or inconsistencies due to custom configurations.
>>>>>>
>>>>>>
>>>>>> *Why should we prefer using the name instead of the ID?*
>>>>>>
>>>>>>    - Hardcoded IDs in Liquibase scripts for global configurations
>>>>>>    can lead to conflicts and inconsistencies, especially when past 
>>>>>> entries
>>>>>>    have been deleted or when projects have introduced custom 
>>>>>> configurations.
>>>>>>    These issues may arise when new global configurations are added.
>>>>>>    - I propose that, moving forward, we avoid providing hardcoded
>>>>>>    IDs for new global configurations. Instead, we should rely on the
>>>>>>    database’s sequence generator or identity solutions to assign IDs. 
>>>>>> This
>>>>>>    practice could also extend beyond global configurations, as hardcoded 
>>>>>> IDs
>>>>>>    are generally not recommended.
>>>>>>
>>>>>> I look forward to hearing your thoughts on this proposal.
>>>>>>
>>>>>> Best regards,
>>>>>> Adam
>>>>>>
>>>>>
>>>>>

Reply via email to