Thunderstore — это база данных модов и API для загрузки модов.
Скопируйте .env.template
в .env
и измените по своему усмотрению. Если у вас есть доступ к подмодулю python-packages
и он клонирован, обязательно установите для BUILD_INSTALL_EXTRAS
значение true
. Любое другое значение не будет работать. Изменение этого параметра потребует пересборки среды (например, с помощью docker compose build
), чтобы изменения вступили в силу.
Запустите docker compose up
Запустите docker compose exec django python manage.py migrate
в другой терминал.
Запустите docker compose exec django python manage.py shell
и введите следующий код:
из django.contrib.sites.models import SiteSite.objects.create(domain="thunderstore.localhost", name="Thunderstore")
Обязательно замените localhost
тем, что вы используете для подключения к сайту! В общем, вам следует использовать thunderstore.localhost
в качестве основного домена для правильной обработки области аутентификации (см. SESSION_COOKIE_DOMAIN
позже).
Вам также потребуется перейти в панель администратора ( /djangoadmin
) и настроить сопоставление сайта с сообществом. Вы можете создать учетную запись суперпользователя с помощью команды управления createsuperuser
Django (аналогично тому, как выполнялась миграция), чтобы получить доступ к панели администратора.
Чтобы подключить сайт к сообществу, вам необходимо:
Убедитесь, что существует хотя бы один объект «Сообщество», или создайте его ( Risk of Rain 2
должен быть создан автоматически).
Убедитесь, что существует хотя бы один объект Site, или создайте его.
Сделайте так, чтобы атрибут domain name
объекта сайта соответствовал тому, который вы используете для подключения к среде разработки.
Создайте новый объект «Сайт сообщества», связав их вместе.
Есть скрипт для заполнения локальной базы данных тестовыми данными. Вы можете запустить его следующим образом:
Docker Compose Exec Django Python Manage.py create_test_data
При локальной разработке minio используется для хранения файлов, совместимого с S3. Вы можете получить к нему доступ через http://localhost:9000/ с учетными данными thunderstore:thunderstore
Документацию по Swagger REST API можно просмотреть в /api/docs/
.
На данный момент единственным подходящим API является /api/v1/package/
, в котором перечислены все активные моды в базе данных. При необходимости конкретный мод также можно получить с помощью конечной точки /api/v1/package/{uuid4}/
, где {uuid4}
заменяется значением uuid4 мода.
Доступ к сайту администратора можно получить из /djangoadmin/
. Для просмотра административного сайта вам необходима учетная запись администратора.
Предполагая, что используется Docker, учетную запись администратора можно создать следующим образом:
docker compose exec django python manage.py createsuperuser
Обратите внимание: если вы работаете в Windows, вам нужно будет использовать winpty для запуска этой команды.
DEBUG
: для производства должно быть установлено значение false или вообще не установлено.
SECRET_KEY
: длинная случайная строка, используемая для хеширования паролей и других данных. Должно оставаться в тайне, как следует из названия.
ALLOWED_HOSTS
: список имен хостов, разделенных запятыми, к которым может быть подключен этот сервер. Например beta.thunderstore.io
PRIMARY_HOST
: общедоступное имя сервера, например beta.thunderstore.io
PROTOCOL
: протокол, который будет использоваться для создания URL-адресов на сервере. Либо https://
либо http://
.
REPOSITORY_MAX_PACKAGE_SIZE_MB
: Максимальный размер одного пакета.
REPOSITORY_MAX_PACKAGE_TOTAL_SIZE_GB
: максимальный общий размер файла, используемый пакетами.
GUNICORN_WORKER_COUNT
: используется для контроля количества рабочих-пушек.
GUNICORN_LOG_LEVEL
: используется для управления уровнем ведения журнала Gunicorn.
SESSION_COOKIE_DOMAIN
: если установлено, разрешает совместное использование сеансов внутри домена и его поддоменов. Например: thunderstore.io
Для локального тестирования рекомендуемые значения:
SESSION_COOKIE_DOMAIN
: thunderstore.localhost
Также убедитесь, что объекты Site указывают на thunderstore.localhost
или некоторые из его поддоменов, например test.thunderstore.localhost
.
SOCIAL_AUTH_SANITIZE_REDIRECTS
: установите значение True
если вы хотите ограничить домены перенаправления OAuth.
SOCIAL_AUTH_ALLOWED_REDIRECT_HOSTS
: список разрешенных доменов перенаправления OAuth, используется, если включен SOCIAL_AUTH_SANITIZE_REDIRECTS
.
SOCIAL_AUTH_INIT_HOST
: хост, используемый для инициализации и обратных вызовов социальной аутентификации, независимо от того, на каком хосте в данный момент находится пользователь. Если не установлено, по умолчанию используется то же значение, что и AUTH_EXCLUSIVE_HOST
. Если ни один из них не установлен, по умолчанию используется хост запроса.
AUTH_EXCLUSIVE_HOST
: имя хоста/домен, который будет использоваться исключительно для логики, связанной с аутентификацией, такой как процесс социальной аутентификации. Если этот параметр не установлен, ни один хост не считается хостом с эксклюзивной аутентификацией.
Для локального тестирования рекомендуемые значения:
AUTH_EXCLUSIVE_HOST
: auth.thunderstore.localhost
SOCIAL_AUTH_SANITIZE_REDIRECTS
: auth.thunderstore.localhost,thunderstore.localhost
Чтобы настроить GitHub OAuth, перейдите в настройки GitHub (личные или организационные настройки) и в разделе Developer Settings
выберите OAuth Apps
.
Создайте новое приложение OAuth и используйте {AUTH_EXCLUSIVE_HOST}/auth/complete/github/
в качестве URL-адреса обратного вызова авторизации, где {AUTH_EXCLUSIVE_HOST}
заменяется значением, которое использовалось для параметра AUTH_EXCLUSIVE_HOST
. Например, для локальной среды вы можете использовать http://auth.localhost/auth/complete/github/
, тогда как для реальной среды https://auth.thunderstore.dev/auth/complete/github/
После создания приложения OAuth вы также должны предоставить приложению следующие переменные среды:
SOCIAL_AUTH_GITHUB_KEY
: значение Client ID
приложения OAuth.
SOCIAL_AUTH_GITHUB_SECRET
Значение Client Secret
приложения OAuth.
Чтобы настроить Discord OAuth, перейдите на панель разработчика Discord и создайте новое приложение OAuth. Добавьте URL-адрес обратного вызова в {AUTH_EXCLUSIVE_HOST}/auth/complete/discord/
, где {AUTH_EXCLUSIVE_HOST}
заменяется значением, которое использовалось для параметра AUTH_EXCLUSIVE_HOST
. Например, для локальной среды вы можете использовать http://auth.localhost/auth/complete/discord/
, тогда как для реальной среды https://auth.thunderstore.dev/auth/complete/discord/
SOCIAL_AUTH_DISCORD_KEY
: значение Client ID
приложения OAuth.
SOCIAL_AUTH_DISCORD_SECRET
Значение Client Secret
приложения OAuth.
Протокол AWS S3/Boto3 поддерживается несколькими поставщиками и сервисами, поэтому реализация может различаться в зависимости от поставщика.
Дополнительную информацию о реализации см. на странице https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html. Также см. Thunderstore/core/settings.py, чтобы узнать, какие переменные среды реализованы в настоящее время.
По крайней мере, установите следующие переменные:
AWS_ACCESS_KEY_ID
: идентификатор ключа аутентификации.
AWS_SECRET_ACCESS_KEY
: секретный ключ аутентификации.
AWS_S3_REGION_NAME
: регион сегмента хранилища.
AWS_S3_ENDPOINT_URL
: конечная точка службы хранилища.
AWS_STORAGE_BUCKET_NAME
: имя сегмента.
AWS_LOCATION
: Местоположение внутри корзины, куда можно загружать файлы.
AWS_S3_SECURE_URLS
: установите значение false, чтобы отключить HTTPS, включенный по умолчанию.
Пользовательские API-интерфейсы работают за счет использования предварительно назначенных URL-адресов хранилища, совместимых с S3, для обработки фактической загрузки. Таким образом, серверная часть usermedia также должна быть серверной частью хранилища, совместимой с S3. Аналогично, серверную часть хранилища пользовательских медиа можно настроить с помощью переменных среды:
USERMEDIA_S3_ENDPOINT_URL
: конечная точка службы хранения с внутренним доступом.
USERMEDIA_S3_ACCESS_KEY_ID
: идентификатор ключа аутентификации.
USERMEDIA_S3_SECRET_ACCESS_KEY
: секрет ключа аутентификации.
USERMEDIA_S3_SIGNING_ENDPOINT_URL
: общедоступная конечная точка службы хранения.
USERMEDIA_S3_REGION_NAME
: регион сегмента хранилища.
USERMEDIA_S3_STORAGE_BUCKET_NAME
: имя сегмента хранилища.
USERMEDIA_S3_LOCATION
: расположение внутри корзины, куда можно загружать файлы.
Самым большим отличием от конфигурации AWS S3 является добавление USERMEDIA_S3_SIGNING_ENDPOINT_URL
. Если это предусмотрено, оно будет использоваться при создании предварительно подписанных URL-адресов. Может использоваться, например, для обхода домена CDN.
Конфигурация базы данных довольно проста при использовании локальной базы данных, где SSL не требуется, но также поддерживается удаленная база данных через соединения SSL.
DATABASE_URL
: URL-адрес базы данных, используемый для подключения к базе данных.
DB_CLIENT_CERT
: сертификат клиента в кодировке Base64, используемый для подключения к базе данных. Будет помещен в client-cert.pem
DB_CLIENT_KEY
: ключ клиента в кодировке Base64, используемый для подключения к базе данных. Будет помещен в client-key.pem
DB_SERVER_CA
: центр сертификации сервера в кодировке Base64, используемый для подключения к базе данных. Будет помещен в server-ca.pem
Доступ к локальной базе данных по умолчанию, настроенной в docker-compose.yml
можно получить:
Из оболочки: docker compose exec db psql -U django
В браузере: перейдите по адресу localhost:8080/?pgsql=db&username=django
и используйте пароль django
Вы можете включить кэширование на бэкэнде Redis, указав URL-адрес Redis.
REDIS_URL
: URL-адрес базы данных Redis, используемый для кэширования, например redis://some-host:6379/0
Тесты можно запустить с помощью этой команды: docker compose exec django pytest
Если вам нужно воссоздать базу данных, используйте следующую команду: docker compose exec django pytest --create-db --migrations
Конвейер CI проверяет, чтобы новые PR не снижали тестовое покрытие. Поскольку этот процесс довольно медленный, перед отправкой PR вы можете проверить покрытие на местном уровне.
Чтобы обновить файл покрытия, запустите docker compose exec django coverage run -m pytest
Чтобы просмотреть отчет о покрытии, запустите docker compose exec django coverage report -m
Тестовый запуск распределяется между несколькими рабочими процессами в конвейере CI, и это разделение направлено на то, чтобы сбалансировать тестирование между всеми доступными рабочими процессами с равными затратами времени.
Чтобы иметь возможность сделать это точно, база данных продолжительности испытаний должна быть актуальной. Поэтому рекомендуется время от времени обновлять базу данных продолжительности испытаний.
Базу данных длительности тестов можно обновить, запустив полный набор тестов с флагом --store-durations
. Таким образом, полный пример команды будет
docker compose exec django pytest --store-durations