GUI каталог backend сервера. Имеет следующие возможности:
- Адаптивная верстка - мобильный/десктопный форм фактор экрана.
- Параметры и фильтрация - доступны все виды фильтрации предоставляемые backend сервером, по фильтрации доступны: по игре/параметр зависимости мода/поиск по имени. К сожалению у разработчика не хватило моральных сил реализовать GUI фильтрацию по тегам, но на backend она реализована.
- Склейка динамика+статика - каталог динамичен, что позволяет удобно его просматривать без догружая только информацию о карточках. Сами страницы модов по большей части статичны и благодаря этому они могут легко индексироваться поисковиками.
- Автогенератор
sitemap.xml- сервер ведет локальный индекс модов из NATS JetStream событийmods.*и на основе него генерирует и актуализируетsitemap.xml.
Сайт подписывается на JetStream-события от open-workshop-manager:
mods.addedmods.changedmods.deleted
Payload для сайта должен содержать id и public; occurred_at используется как дата обновления, если он передан. title и full_description сайт не хранит и не использует. Локальный индекс ведется через SQLAlchemy и хранится в отдельной MySQL-базе MOD_EVENTS_INDEX_DATABASE (website по умолчанию), таблица MOD_EVENTS_INDEX_TABLE (known_mods по умолчанию). Сайт хранит только индексируемые моды: public == 0 добавляет или обновляет запись, public != 0 и mod.deleted физически удаляют запись из локального индекса. Все настройки этого индекса и NATS берутся из ow_config.py. При изменении индекса кэш website/sitemaps/*.sitemap.xml сбрасывается, чтобы следующий запрос собрал актуальный sitemap.
Минимальная конфигурация в ow_config.py:
NATS_URLS = ["nats://127.0.0.1:4222"]
MOD_EVENTS_INDEX_DATABASE = "website"Сайт использует access только на стороне сервера для проверки прав и доступности кнопок.
Для локального запуска рядом с manager укажите ACCESS_SERVICE_URL в ow_config.py и убедитесь, что браузер не получает этот адрес в публичном JSON-конфиге.
Сервер отправляет трейсы в Uptrace через OpenTelemetry, если задан UPTRACE_DSN.
Пример запуска:
export UPTRACE_DSN="https://<token>@api.uptrace.dev/<project_id>"
export OTEL_SERVICE_NAME="open-workshop-website"
export OTEL_SERVICE_VERSION="1.0.0"
export OTEL_DEPLOYMENT_ENVIRONMENT="production"
# export UPTRACE_OTLP_PROTOCOL="grpc" # or "http"
# export UPTRACE_FLASK_EXCLUDED_URLS="^https?://[^/]+/assets/.*,^https?://[^/]+/favicon\\.ico$,^https?://[^/]+/robots\\.txt$"
python3 main.pyОпционально можно переопределить OTLP endpoint:
export UPTRACE_OTLP_TRACES_URL="https://api.uptrace.dev/v1/traces"
# export UPTRACE_OTLP_GRPC_URL="https://api.uptrace.dev:4317"По умолчанию статические URL (/assets/*, favicon, robots.txt) исключаются из трейсинга
(в формате полного URL, как его проверяет Flask-инструментатор),
чтобы не забивать список спанов служебным шумом.