Course catalog is empty

Hi everyone
Hoping someone can give me some pointers here, I’ve noticed that it’s impossible for any of my users to browse any courses (entirely 100% of all courses)
They can see their enrolled courses on the /learner-dashboard page but the /catalog/courses page (Discover New) says

No courses available
There are currently no courses available in the catalog. Please check back later for new offerings.

If I look under https://discovery.lms.domain.tld/admin/course_metadata/course/ then i can see all the courses there.
If I try reindex courses it proceeds to index them fine using tutor local run cms ./manage.py cms reindex_course --all
If I try refresh course metadata using tutor local run discovery ./manage.py refresh_course_metadata --partner_code=openedx then it gives timeout errors like these:

2026-02-04 11:49:59,614 INFO 1 [course_discovery.apps.course_metadata.data_loaders.api] /openedx/discovery/course_discovery/apps/course_metadata/data_loaders/api.py:63 - Refreshing Courses and CourseRuns from https://lms.domain.tld/api/courses/v1/...
2026-02-04 11:49:59,614 INFO 1 [course_discovery.apps.course_metadata.data_loaders.api] /openedx/discovery/course_discovery/apps/course_metadata/data_loaders/api.py:109 - Requesting course run page 1...
2026-02-04 11:52:09,839 INFO 1 [backoff] /openedx/venv/lib/python3.12/site-packages/backoff/_common.py:105 - Backing off _make_request(...) for 17.9s (requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='lms.domain.tld', port=443): Max retries exceeded with url: /api/courses/v1/courses/?page=1&page_size=50&username=discovery&active_only=True (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x7fcb9b913740>, 'Connection to lms.domain.tld timed out. (connect timeout=None)')))
2026-02-04 11:52:27,711 INFO 1 [course_discovery.apps.course_metadata.data_loaders.api] /openedx/discovery/course_discovery/apps/course_metadata/data_loaders/api.py:109 - Requesting course run page 1...
2026-02-04 11:54:37,294 INFO 1 [backoff] /openedx/venv/lib/python3.12/site-packages/backoff/_common.py:105 - Backing off _make_request(...) for 8.8s (requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='lms.domain.tld', port=443): Max retries exceeded with url: /api/courses/v1/courses/?page=1&page_size=50&username=discovery&active_only=True (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x7fcb9b930140>, 'Connection to lms.domain.tld timed out. (connect timeout=None)')))
2026-02-04 11:54:46,141 INFO 1 [course_discovery.apps.course_metadata.data_loaders.api] /openedx/discovery/course_discovery/apps/course_metadata/data_loaders/api.py:109 - Requesting course run page 1...

it seems to look a lot like this here: max-retries-exceeded-with-url but I don’t understand what to make of the info here, doesn’t exactly say what the fix is.

where am i going wrong?
Thank you

tutor, version 21.0.0
discovery, version 21.0.1
mfe, version 21.0.0

1 Like

Hey @joel.edwards could I clarify, are you using the new Catalog MFE?

Hi @sarina
Yes that’s right, I do have catalog MFE installed, did it using this plugin with the updated edx-search version as was described in another recent post like this:

from tutormfe.hooks import MFE_APPS
from tutor import hooks


INSTALL_SEARCH_440 = r"""
RUN --mount=type=cache,target=/openedx/.cache/pip,sharing=shared \
    pip install "edx-search==4.4.0"
"""

hooks.Filters.ENV_PATCHES.add_items([
    ("openedx-dockerfile-post-python-requirements", INSTALL_SEARCH_440),
    ("openedx-dev-dockerfile-post-python-requirements", INSTALL_SEARCH_440),
])

@MFE_APPS.add()
def _add_catalog_mfe(mfes):
    mfes["catalog"] = {
        "repository": "https://github.com/openedx/frontend-app-catalog.git",
        "port": 1998,
        "version": "master", # optional, will default to the Open edX current tag.
    }
    return mfes

catalog_mfe_url = """
CATALOG_MICROFRONTEND_URL = "http://{{ MFE_HOST }}/catalog"
"""

catalog_mfe_url_dev = """
CATALOG_MICROFRONTEND_URL = "http://{{ MFE_HOST }}:{{ get_mfe('catalog').port }}/catalog"
"""

env_items = [
    (
        "openedx-common-settings",
        catalog_mfe_url,
    ),
    (
        "openedx-development-settings",
        catalog_mfe_url_dev,
    ),
    (
        "openedx-lms-common-settings",
        "ENABLE_CATALOG_MICROFRONTEND = True",
    ),
]

for item in env_items:
    hooks.Filters.ENV_PATCHES.add_item(item)

Have you run with tutor-discovery enabled in the past? If so, did the refresh_course_metadata task stop working just on the most recent upgrade to Ulmo?

this seems promising. Do you have shell access to the Discovery app? If so, could you start a shell into it and run ping lms.domain.tld and nsloookup lms.domain.tld, and share some of the output ?

I have in prior versions enabled the discovery plugin though I’m not convinced I’d ever configured it properly before, I think I may have just somewhat given up and left it. As far as I remember this is the first time I’ve ever tried running the refresh_course_metadata task.

I couldn’t figure out how to get that to work actually, seems like ping/nslookup are not included in the containers by default and couldn’t figure out how to add them.

For what it’s worth, I’ve now disabled catalog and discovery followed by rebuilding everything and it looks like my courses are showing again…

Ah, right, those commands would only be available on the dev containers, not production ones. My mistake

Glad your courses are showing again, sorry we couldn’t be more helpful. For what it’s worth, unless you specifically need any features from tutor-discovery, I would recommend leaving it disabled. In my experieince, it’s more trouble than it’s worth. But if you do need tutor-discovery, let me know and I can lend a hand debugging that connection issue.