Understanding Configuration in Vidos

Vidos uses a layered configuration system that provides consistent settings across your deployment while enabling customization at multiple levels. This approach helps you manage configurations across services efficiently while maintaining flexibility and control.

Why Layered Configuration?

A layered configuration system enables you to:

  • Ensure all services start with secure, working settings
  • Share common configurations across multiple services
  • Customize specific instances without affecting others
  • Maintain configurations efficiently at scale

How Configuration Works

The Three Layers

Vidos builds configurations using three distinct layers:

  1. Core Configuration

    • Provided by Vidos
    • Contains all required settings
    • Cannot be modified
    • Ensures service stability
  2. Custom Configuration

    • Reusable configuration sets
    • Applied to multiple service instances
    • Specifies only changed values
    • Overrides core settings
  3. Inline Configuration

    • Instance-specific settings
    • Affects only one service instance
    • Specifies only changed values
    • Overrides previous layers

Layer Composition

Here's how these layers combine using a CORS (Cross-Origin Resource Sharing) configuration example:

  1. Core Configuration

    {
        "cors": {
            "allowHeaders": [],
            "allowMethods": ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"],
            "credentials": false,
            "enabled": false,
            "exposeHeaders": [],
            "maxAge": 86400,
            "origin": ["*"]
        }
    }
  2. Custom Configuration

    {
        "cors": {
            "enabled": true,
            "origin": ["https://app.example.com", "https://api.example.com"],
            "credentials": true
        }
    }

    After applying custom configuration:

    {
      "cors": {
        "allowHeaders": [],                    # ⬅ From core configuration
        "allowMethods": [                      # ⬅ From core configuration
          "GET",
          "POST",
          "PUT",
          "PATCH",
          "DELETE",
          "OPTIONS"
        ],
        "credentials": true,                   # ⬅ From custom configuration
        "enabled": true,                       # ⬅ From custom configuration
        "exposeHeaders": [],                   # ⬅ From core configuration
        "maxAge": 86400,                       # ⬅ From core configuration
        "origin": [                            # ⬅ From custom configuration
          "https://app.example.com",
          "https://api.example.com"
        ]
      }
    }
  3. Inline Configuration

    {
        "cors": {
            "allowHeaders": ["Content-Type", "Authorization"],
            "origin": ["https://test.example.com"]
        }
    }

    Final configuration:

    {
      "cors": {
        "allowHeaders": [                      # ⬅ From inline configuration
          "Content-Type",
          "Authorization"
        ],
        "allowMethods": [                      # ⬅ From core configuration
          "GET",
          "POST",
          "PUT",
          "PATCH",
          "DELETE",
          "OPTIONS"
        ],
        "credentials": true,                   # ⬅ From custom configuration
        "enabled": true,                       # ⬅ From custom configuration
        "exposeHeaders": [],                   # ⬅ From core configuration
        "maxAge": 86400,                       # ⬅ From core configuration
        "origin": [                            # ⬅ From inline configuration
          "https://test.example.com"
        ]
      }
    }

Key Concepts

  1. Layer Application Order

    • Core configuration establishes base settings
    • Custom configuration provides shared overrides
    • Inline configuration sets instance-specific values
  2. Configuration Scope

    • Custom configurations are reusable across instances
    • Inline configurations apply to single instances
    • Each layer can override previous layer values
  3. Partial Configurations

    • Override configurations specify only changed values
    • Unspecified values inherit from previous layers
    • All settings maintain a value through inheritance