Backend сервиса OpenWorkshop.Manager. Это ASGI-приложение для аккаунтов, игр, модов, ресурсов, тегов, ассоциаций и служебных админских операций.
- Код лежит в
src/open_workshop_manager, проект используетsrc-layout. - Сервер запускается через Granian.
- SQL-слой переведён на async SQLAlchemy +
aiomysql. - Ответы и ошибки оформляются через Pydantic-модели и единый слой стандартов.
- Для локальной разработки есть отдельные
make-цели, скрипты и совместимый legacy-конфиг.
src/open_workshop_manager- основной пакет приложенияscripts- админские утилитыmigration_scripts- вспомогательные скрипты для данныхmain.py- compatibility shim для старого способа запускаstart.sh/start.bat- готовые сценарии запуска
- Python 3.11 или новее
- MySQL / MariaDB
- Доступ к сервису хранения файлов
- При необходимости:
- Google OAuth credentials
- Yandex OAuth credentials
- Uptrace для трассировки
python -m pip install -e .python -m pip install -e '.[dev]'
# или
python -m pip install -r requirements-dev.txtpython -m open_workshop_manageropen-workshop-manager./start.sh
start.batПо умолчанию сервер слушает 127.0.0.1:7776.
Можно переопределить:
OPEN_WORKSHOP_MANAGER_HOSTOPEN_WORKSHOP_MANAGER_PORTOPEN_WORKSHOP_MANAGER_WORKERSOPEN_WORKSHOP_MANAGER_ACCESS_LOG
Проект читает настройки из переменных окружения.
Если переменная не задана, поддерживается legacy-файл ow_config.py.
Для нового развёртывания лучше использовать именно env-переменные.
OPEN_WORKSHOP_MANAGER_HOST- адрес GranianOPEN_WORKSHOP_MANAGER_PORT- порт GranianOPEN_WORKSHOP_MANAGER_WORKERS- число воркеровOPEN_WORKSHOP_MANAGER_ACCESS_LOG- включать ли access log
MYSQL_HOSTMYSQL_PORTMYSQL_USERMYSQL_PASSWORD
Для старых конфигов также понимаются:
url_sqlport_sqluser_sqlpassword_sql
MAIN_URL- базовый префикс API, по умолчанию/api/accountsSTORAGE_URL- адрес storage-сервисаAPI_BASE_URL- внешний базовый URL приложенияACCESS_SERVICE_URL- адрес сервиса расчёта правACCESS_SERVICE_TOKEN- токен manager -> accessACCESS_CALLBACK_TOKEN- доверенный токен access -> manager для fallback callbackACCESS_TIMEOUT_SECONDS- таймаут запросов к access-сервисуTRANSFER_JWT_SECRET- секрет для transfer JWTTRANSFER_JWT_TTL_SECONDS- TTL для transfer JWTSTORAGE_TIMEOUT_SECONDS- таймаут запросов к storage
YANDEX_CLIENT_IDYANDEX_CLIENT_SECRETGOOGLE_OAUTH_CREDENTIALS_PATH- путь к JSON с Google OAuth credentialsCOOKIE_DOMAINCOOKIE_SAMESITECOOKIE_SECURE
По умолчанию Google credentials читаются из credentials.json в корне
репозитория, если путь не переопределён.
STORAGE_UPLOAD_TOKENSTORAGE_DELETE_TOKENSTORAGE_MANAGE_TOKEN
ACCESS_SERVICE_TOKENACCESS_CALLBACK_TOKEN
ACCESS_CALLBACK_TOKEN используется доверенным callback-роутом между
access-сервисом и manager. Его можно хранить как обычный секрет или как
bcrypt-хэш.
CORS_ORIGINSALLOW_LOCALHOST_CORSLOCALHOST_CORS_ORIGINS
UPTRACE_DSNOTEL_SERVICE_NAMEOTEL_SERVICE_VERSIONOTEL_DEPLOYMENT_ENVIRONMENTUPTRACE_OTLP_PROTOCOLUPTRACE_OTLP_TRACES_URLUPTRACE_OTLP_GRPC_URLUPTRACE_FASTAPI_EXCLUDED_URLSUPTRACE_FASTAPI_EXCLUDE_SPANS
После запуска доступны стандартные страницы FastAPI:
/docs/redoc/openapi.json
python scripts/register_user.py <username>
python scripts/register_user.py <username> --password "secret123"
python scripts/register_user.py <username> --adminpython scripts/change_password.py <username>
python scripts/change_password.py <username> --password "new-secret"change_password.py обновляет bcrypt-хэш пароля и инвалидирует активные
сессии пользователя.
make format
make lint
make type-checkformat-isort+blacklint-flake8+isort --check-onlytype-check-mypy
При старте приложение создаёт отсутствующие таблицы через SQLAlchemy metadata. Это удобно для пустого окружения, но не заменяет полноценные миграции.
Если задать UPTRACE_DSN, приложение начнёт отправлять трейсы в Uptrace.
Пример запуска:
export UPTRACE_DSN="https://<token>@api.uptrace.dev/<project_id>"
export OTEL_SERVICE_NAME="open-workshop-manager"
export OTEL_SERVICE_VERSION="1.0.0"
export OTEL_DEPLOYMENT_ENVIRONMENT="production"
# export UPTRACE_OTLP_PROTOCOL="grpc" # или "http"
# export UPTRACE_FASTAPI_EXCLUDED_URLS="^.*/docs$,^.*/openapi\\.json$,^/favicon\\.ico$,^/robots\\.txt$"
# export UPTRACE_FASTAPI_EXCLUDE_SPANS="receive,send"
python -m open_workshop_managerМожно также переопределить OTLP endpoint:
export UPTRACE_OTLP_TRACES_URL="https://api.uptrace.dev/v1/traces"
# export UPTRACE_OTLP_GRPC_URL="https://api.uptrace.dev:4317"ow_config.py поддерживается для старых локальных установок, но новый формат
конфигурации лучше держать через переменные окружения.