Managing Application Configuration with .env-app Files and Real Environment Variables in Oro 

The following guide provides instructions on how to migrate from using a config/parameters.yml file to using environment variables or a .env-app file in an Oro application.

You can find more examples of DSNs in the .env-app file at the application root folder or the corresponding documentation sections.

Managing Application Configuration with .env-app Files 

In an Oro application, the configuration of the environment variables can be managed through the use of .env-app files. These files are used to define default values for the environment variables that are needed by the application.

There are four types of .env-app files that can be used:

.env-app: This file contains the default values for the environment variables needed by the app. .env-app.local: This file is an uncommitted file with local overrides. It is intended for local development and should not be committed to version control. .env-app.$ORO_ENV: This file contains committed environment-specific defaults. For example, .env-app.prod would contain the default values for the environment variables needed by the app in a production environment. .env-app.$ORO_ENV.local: This file is an uncommitted environment-specific overrides. It is intended for local development and should not be committed to version control. It’s important to note that real environment variables take precedence over the .env-app files.

It’s also important to note that you should not define production secrets any committed files. Instead, it’s recommended to use environment variables for infrastructure configuration. To compile .env-app files for production use, you can run the command composer dump-env prod.

It’s important to note that the file name used in this guide is .env-app, as opposed to the commonly used .env file. This is because the .env file is commonly used by dev ops teams and other services for managing environment variables, and it’s important to not confuse the two files or accidentally add the wrong file to version control. By using the .env-app file specifically for the Oro application, it clearly differentiates the configuration for the application and avoids any potential conflicts with other services using a .env file. It also helps to keep the application’s configuration separate and easily manageable.

In summary, the .env-app files provide a way to manage the configuration of environment variables in an Oro application. They allow for default values to be set and for local and environment-specific overrides to be made. It’s important to use real environment variables instead of committing sensitive information to these files and it’s recommended to use the composer dump-env command to compile the files for production use. Using these files allows for a more organized and flexible way to manage the configuration of an Oro application.

Migration from config/parameters.yml to Environment Variables or .env-app 

Database Connection 

Instead of using the following configuration in config/parameters.yml:

parameters:
    database_driver:         pdo_pgsql
    database_host:           '%env(ORO_DB_HOST)%'
    database_port:           '%env(ORO_DB_PORT)%'
    database_name:           '%env(ORO_DB_NAME)%'
    database_user:           '%env(ORO_DB_USER)%'
    database_password:       '%env(ORO_DB_PASSWORD)%'
    database_server_version: '%env(ORO_DB_VERSION)%'
    database_driver_options: []

You can now use a single environment variable with the DSN:

ORO_DB_DSN=postgres://oro_db_user:oro_db_pass@127.0.0.1:5432/oro_db?sslmode=disable&charset=utf8&serverVersion=13.7

Web Socket Connections 

Instead of using the following configuration in config/parameters.yml:

parameters:
    websocket_bind_address:                "0.0.0.0"  # The host IP the socket server will bind to
    websocket_bind_port:                   8080       # The port the socket server will listen on
    websocket_frontend_host:               "*"        # Websocket host the browser will connect to
    websocket_frontend_port:               8080       # Websocket port the browser will connect to
    websocket_frontend_path:               ""         # Websocket url path the browser will connect to (for example "/websocket" or "/ws")
    websocket_backend_host:                "*"        # Websocket host the application server will connect to
    websocket_backend_port:                8080       # Websocket port the application server will connect to
    websocket_backend_path:                ""         # Websocket url path the application server will connect to (for example "/websocket" or "/ws")
    websocket_backend_transport:           tcp        # Socket transport (for example "tcp", "ssl" or "tls")
    websocket_backend_ssl_context_options: {}         # Socket context options, usually needed when using secure transport

You can now use three environment variables with DSNs:

ORO_WEBSOCKET_SERVER_DSN=//0.0.0.0:8080
ORO_WEBSOCKET_FRONTEND_DSN=//*:8080/ws
ORO_WEBSOCKET_BACKEND_DSN=tcp://127.0.0.1:8080

Note that * means to listen to all hosts.

Search Engine Connections 

Instead of using the following configuration in config/parameters.yml:

parameters:
    # search engine configuration
    search_engine_name:                 orm
    search_engine_host:                 '%env(ORO_SEARCH_HOST)%'
    search_engine_port:                 '%env(ORO_SEARCH_PORT)%'
    search_engine_index_prefix:         '%env(ORO_SEARCH_INDEX_PREFIX)%'
    search_engine_username:             '%env(ORO_SEARCH_USER)%'
    search_engine_password:             '%env(ORO_SEARCH_PASSWORD)%'
    search_engine_ssl_verification:     '%env(ORO_SEARCH_ENGINE_SSL_VERIFICATION)%'
    search_engine_ssl_cert:             '%env(ORO_SEARCH_ENGINE_SSL_CERT)%'
    search_engine_ssl_cert_password:    '%env(ORO_SEARCH_ENGINE_SSL_CERT_PASSWORD)%'
    search_engine_ssl_key:              '%env(ORO_SEARCH_ENGINE_SSL_KEY)%'
    search_engine_ssl_key_password:     '%env(ORO_SEARCH_ENGINE_SSL_KEY_PASSWORD)%'

    # website search engine configuration
    website_search_engine_index_prefix: '%env(ORO_SEARCH_WEBSITE_INDEX_PREFIX)%'

You can now use two environment variables with DSNs:

ORO_SEARCH_ENGINE_DSN=orm:?prefix=oro_search
ORO_WEBSITE_SEARCH_ENGINE_DSN=orm:?prefix=oro_website_search

For elasticsearch search engine, use the following format:

ORO_SEARCH_ENGINE_DSN=elastic-search://valid_user:valid_password@127.0.0.1:9200?prefix=oro_search

Note that in the above examples, valid_user:valid_password@ - DSNs part can be skipped if authentication is not enabled.

Sessions Storage Configuration 

Instead of using the session_handler parameter, you can now use the ORO_SESSION_DSN environment variable. The default value is native:, but you can provide a redis DSN to use redis as the session handler.

Redis Connections 

To configure Redis connections, including types, instead of:

parameters:
    session_handler:         'snc_redis.session.handler'
    redis_dsn_session:       'redis://127.0.0.1:6379/0'
    redis_dsn_cache:         'redis://127.0.0.1:6380/0'
    redis_dsn_doctrine:      'redis://127.0.0.1:6380/1'
    redis_dsn_session_type:  'standalone' #optional, current configuration is applied if it's not set
    redis_dsn_cache_type:    'standalone' #optional, current configuration is applied if it's not set
    redis_dsn_doctrine_type: 'standalone' #optional, current configuration is applied if it's not set

Use:

ORO_SESSION_DSN=redis://127.0.0.1:6379/0
ORO_REDIS_CACHE_DSN=redis://127.0.0.1:6379/1
ORO_REDIS_DOCTRINE_DSN=redis://127.0.0.1:6379/2
ORO_REDIS_LAYOUT_DSN=redis://127.0.0.1:6379/3

When configuring a Redis Sentinel or Cluster connection, it’s important to use the correct DSN format.

For Sentinel connections, use the following format:

redis://127.0.0.1:26379?dbindex=1&redis_sentinel=lru_cache_mon

For Cluster connections, use the following format:

redis://password@127.0.0.1:6379?host[127.0.0.1:6380]&dbindex=1&cluster=predis

Note that in the above examples, the password and dbindex values are optional and should be replaced with the appropriate values for your configuration. Additionally, in cluster example you can add multiple hosts.

And to enable the possibility of setting Redis connection configurations from environment variables, run the following command:

composer set-parameters redis

RabbitMQ Connection 

Instead of using the following configuration in config/parameters.yml:

parameters:
    message_queue_transport:        'amqp'
    message_queue_transport_config: { host: 'localhost', port: '5672', user: 'guest', password: 'guest', vhost: '/master' }

You can now use the ORO_MQ_DSN environment variable:

ORO_MQ_DSN=amqp://guest:guest@localhost:5672/%2Fmaster

When configuring a virtual host (vhost), it’s important to note that the vhost must be URL encoded. If no vhost is provided, the default value of / will be used. As an example, if the vhost is /master, the corresponding url encoded vhost value is %2Fmaster, and if the vhost is master, the url encoded value is master.

MongoDB Connection 

To configure MongoDB as a file storage, instead of:

parameters:
    gaufrette_adapter.public:  'gridfs:mongodb://user:password@host1:27017,host2:27017/media'
    gaufrette_adapter.private: 'gridfs:mongodb://user:password@host1:27017,host2:27017/media'

Use:

ORO_MONGODB_DSN_PUBLIC=mongodb://127.0.0.1:27017/media
ORO_MONGODB_DSN_PRIVATE=mongodb://127.0.0.1:27017/private

And to enable the possibility of setting MongoDB connection configurations from environment variables, run the following command:

composer set-parameters mongo

Enterprise License, PNGQuant and JPEGOptim Libraries Paths 

These parameters:

parameters:
    enterprise_licence:             ~
    liip_imagine.jpegoptim.binary:  null
    liip_imagine.pngquant.binary:   null

Are now set using the corresponding environment variables:

ORO_ENTERPRISE_LICENCE=
ORO_JPEGOPTIM_BINARY=
ORO_PNGQUANT_BINARY=

Web Backend Prefix 

The web_backend_prefix is now hardcoded in the config/config.yml and committed to git.

Deployment Type 

The deployment_type parameter has been removed. Instead, you should use custom Symfony application environments. You can set the Symfony application environment using the ORO_ENV environment variable:

ORO_ENV=prod

Other Configuration 

The following parameters are read from environment variables as before:

  • secret

  • mailer_dsn

  • tracking_data_folder

These parameters should be configured in the environment variables, such as ORO_SECRET, ORO_MAILER_DSN and ORO_TRACKING_DATA_FOLDER.