Best Practices for Version Controlling OOTB Liferay Configurations and Site Setup in Git

Hi Everyone,

We are developing an application using mostly Liferay out-of-the-box (OOTB) features and very little custom backend development. Our implementation heavily relies on features such as:

  • Fragments

  • Objects

  • Categories and Tags

  • Workflows

  • Notification Templates

  • Pages and Page Hierarchies

  • Object Actions

  • Custom Fields (Expando)

  • Widget/Page Configurations

  • Other low-code/no-code Liferay capabilities

To manage deployments across environments, we export the site configurations and maintain them within a Liferay Workspace that is version controlled using Git.

However, we have noticed that some configurations are not fully covered by export/import mechanisms or Site Initializers. Examples include:

  • Certain Object Action configurations

  • Portlet Preferences and widget-level configurations on pages

  • Fragment configuration values

  • Some instance/site-level settings

  • Other configurations that are created through the UI and are not easily exportable

Our long-term goal is to support a multi-tenant architecture where new Virtual Instances can be provisioned automatically with the same baseline configuration. We would like to:

  1. Store as much configuration as possible in Git.

  2. Track changes to configurations through version control.

  3. Automate tenant provisioning without requiring manual UI configuration.

  4. Ensure consistent deployments across environments and virtual instances.

My questions are:

  • What are the recommended approaches for managing and version controlling OOTB Liferay configurations that are not included in standard exports?

  • How do teams typically manage Portlet Preferences and widget configurations in source control?

  • Are there recommended patterns for handling Object Actions and other non-exportable configurations?

  • Is there a preferred combination of Site Initializers, Client Extensions, Configuration Files, Upgrade Processes, or APIs to automate these setups?

  • How do organizations maintain configuration drift and change tracking when most of the application is built using Liferay’s low-code features?

Any guidance, best practices, or real-world examples would be greatly appreciated.

Thank you.