Help with multitenancy via eox-tenant plugin

I am trying to use eduNEXT/eox-tenantplugin to achieve multi-tenancy where I have two sites: site-a.local.openedx.io & site-b.local.openedx.io
For both the LMS sites i want to use single studio site as studio.local.openedx.io for authoring courses.

To achieve this I have installed eduNEXT/eox-tenanand used below commands to generate routes and tenant configs:

./manage.py lms create_or_update_tenant_config --external-key 7 --config ‘{“course_org_filter”: [“site-a”], “lms_configs”: {“EDNX_USE_SIGNAL”: true, “PLATFORM_NAME”: “site-a.local.openedx.io”}}’ site-a.local.openedx.io studio.local.openedx.io preview.site-a.local.openedx.io

./manage.py lms create_or_update_tenant_config --external-key 8 --config ‘{“course_org_filter”: [“site-b”] “lms_configs”: {“EDNX_USE_SIGNAL”: true, “PLATFORM_NAME”: “site-b.local.openedx.io”}}’ site-b.local.openedx.io studio.local.openedx.io preview.site-b.local.openedx.io

After completing these changes on opening the newly created tenant domain the site was not opening up, throwing a “connection refused” error, soI checked Caddyfile and the new domains were not added to it, so I replaced old domains with new domain blocks in Caddyfile, but even after replacing domains when I open site-a.local.openedx.io, then I am redirected to site-a.local.openedx.io/dashborad and agin redirected to apps.local.openedx.io/learner-dashboard with a blank page.

Am I missing anything in the setup?

@Andrey @mafermazu Guyz can you please help me out with setting up eox-tenant?

Hi @Sliver_Horizon , sure, I can help you with that. I just need a few more details:

  1. Are you working in a local environment, or is this a hosted implementation?

  2. Which version are you currently using(platform a eox-tenant plugin)?

  3. Could you please share the content of /admin/eox_tenant/route/ and /admin/eox_tenant/tenantconfig/?

  1. Are you working in a local environment, or is this a hosted implementation?
    For now it is a local environment, setup with tutor

  2. Which version are you currently using(platform a eox-tenant plugin)?
    Tutor: v20.0.1
    eox-tenant: v14.0.0

  3. Could you please share the content of /admin/eox_tenant/route/ and /admin/eox_tenant/tenantconfig/?

    /admin/eox_tenant/route/ :

    /admin/eox_tenant/tenantconfig/ :

@Andrey If you need any other information please let me know

A similar discussion is ongoing here for multi-tenancy.

Let’s combine both here.

@Andrey, I’ve seen your responses regarding multi-tenancy. It would be great if you could share any documentation or step-by-step guidance for configuring this.

Thanks

Hi @Sliver_Horizon

Your configuration looks fine. Indeed, this plugin is not difficult to set up, but there may be a misunderstanding about its scope. Basically, this plugin allows you to edit or insert new settings based on the domain. It does not modify other aspects of the platform, such as the Caddy file.

If you need to change that behavior, you would either need a Tutor plugin or make those changes manually. That said, when working with a standard local Tutor setup, you do not need to modify the Caddy file. You can access any domain prefix as long as you keep the base domain local.openedx.io. I’ve attached a video showing this behavior.

That said, the issue might be related to how you are testing the expected behavior. You are expecting a different result when accessing the dashboard page; however, the LEARNER_HOME_MICROFRONTEND_URL setting has not been modified, so the page will redirect to the base configuration.

Hi @Andrey, I was able to make multiple sites work for lms, but now cms seems to be having issues while launching.

There seems to be an issue with OAuth2

Error log:

lms-1 | [14/Jan/2026 13:24:59] “GET /oauth2/authorize?client_id=cms-sso-dev&redirect_uri=http%3A%2F%``2Fstudio.local.openedx.io``%3A8001%2Fcomplete%2Fedx-oauth2%2F%3Fredirect_state%3DbnNnpnn75nNZZgpy6LVBEWVIXxCenwkz&state=bnNnpnn75nNZZgpy6LVBEWVIXxCenwkz&response_type=code&scope=user_id+profile+email HTTP/1.1” 400 20768

lms-1 | 2026-01-14 13:24:59,257 INFO 30 [eox_tenant.signals] [user None] [ip None] signals.py:49 - Site ``local.openedx.io``, does not use eox_tenant signals

Any idea why am I facing this issue after installing eox-tenant?

Hi @Sliver_Horizon you have two options, you can update eox-tenant to 14.2.0 or add the following setting

ALLOWED_AUTH_APPLICATIONS = [‘cms-sso’, ‘cms-sso-dev’]

Hi @Andrey, updating plugin to 14.2.0 has fixed it, but I am facing two other issues with the plugin.

  1. On LMS site when I click on Discover Course button then my current URL (http://site-a.local.openedx.io:1996/learner-dashboard/) redirects to http://local.openedx.io:8000/courses rather than redirecting to http://site-a.local.openedx.io:8000/courses. Due to which course filtering is not working as my domain is getting set to base domain for frontend on 8000 port. (Note: When I manually update the url to http://site-a.local.openedx.io:8000/courses than course filtering is properly done as per the domain and organization mapping)
  2. On the Learner Dashboard page, when I am using http://site-a.local.openedx.io:1996/learner-dashboard/ URL then all other organization courses are seen but not the courses set for “site-a“ organization.

My current tenant config for site-a:

Hi @Sliver_Horizon

Sorry, but I cannot help you with that. As I mentioned before, eox-tenant allows you to edit or insert new settings based on the domain at the backend level, and it does not modify other aspects of the platform, such as the MFEs.

The reason behind the result you are seeing is that local MFEs are not designed to work in a multi-tenant platform. There are multiple strategies to address this, but I have never implemented them in a local environment.

If you check the network requests, you will find a call to:

http://apps.local.openedx.io:1996/api/mfe_config/v1?mfe=learner-dashboard

which internally calls:

http://local.openedx.io:8000/api/mfe_config/v1?mfe=learner-dashboard

This is incorrect. It should instead call:

http://site-a.local.openedx.io:8000/api/mfe_config/v1?mfe=learner-dashboard.

If you inspect the response of the previous request, you will likely find a key called LMS_BASE_URL, which should contain the site-a domain instead of the default one. There are also additional settings that will return an invalid domain for the same reason.

All of this points to a configuration issue. If your goal is only to validate the eox-tenant behavior at the learner-dashboard MFE level, you can make a request to:

http://site-a.local.openedx.io:8000/api/learner_home/init

and compare the response with:

http://local.openedx.io:8000/api/learner_home/init.

The issue you are facing is simply that the MFE has not been configured with the correct values.

Hi @Andrey

I’m facing an issue with eox-tenant where, inside signals.py eox-tenant/eox_tenant/signals.py at 3aca561697f2a99b80390cc8ec8813b782dc1fef · eduNEXT/eox-tenant · GitHub, the domain being received is local.openedx.io even though I’m accessing the site via site-a.local.openedx.io.

Is there any additional configuration that needs to be updated to handle this correctly?