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 导入 SiteSite.objects.create(domain="thunderstore.localhost", name="Thunderstore")
确保将localhost
替换为您用于连接到该站点的内容!一般来说,您应该使用thunderstore.localhost
作为主域来正确处理身份验证范围(稍后请参阅SESSION_COOKIE_DOMAIN
)
您还需要导航到管理面板 ( /djangoadmin
) 并配置从站点到社区的映射。您可以使用createsuperuser
Django 管理命令(类似于 migrate 的运行方式)创建一个超级用户帐户,以获得对管理面板的访问权限。
要将站点连接到社区,您需要:
确保至少存在一个社区对象或创建一个( Risk of Rain 2
应自动创建)
确保至少存在一个 Site 对象或创建一个
使站点对象的domain name
属性与您用于连接到开发环境的域名属性相匹配
创建一个新的社区站点对象,将两者链接在一起
有一个脚本用于使用测试数据填充本地数据库。您可以按如下方式运行它:
docker compose exec django python manage.py create_test_data
在本地开发中,minio用于S3兼容的文件存储。您可以使用thunderstore:thunderstore
凭据通过 http://localhost:9000/ 访问它
可以从/api/docs/
查看 REST API swagger 文档。
目前,唯一相关的 API 是/api/v1/package/
,它列出了数据库中的所有活动 mod。如有必要,还可以使用/api/v1/package/{uuid4}/
端点获取特定的 mod,其中{uuid4}
替换为 mod 的 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将产生多少个工人
GUNICORN_LOG_LEVEL
:用于控制gunicorn的日志记录级别
SESSION_COOKIE_DOMAIN
:如果设置,则允许在域及其子域内共享会话。例如: thunderstore.io
对于本地测试,建议值为:
SESSION_COOKIE_DOMAIN
: thunderstore.localhost
还要确保 Site 对象指向thunderstore.localhost
或其某些子域,例如test.thunderstore.localhost
。
SOCIAL_AUTH_SANITIZE_REDIRECTS
:如果要限制 OAuth 重定向域,请设置为True
。
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
:OAuth 应用程序的Client ID
值
SOCIAL_AUTH_GITHUB_SECRET
OAuth 应用程序的Client Secret
值
要设置 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
:OAuth 应用程序的Client ID
值
SOCIAL_AUTH_DISCORD_SECRET
OAuth 应用程序的Client Secret
值
AWS S3 / Boto3 协议受到多个供应商和服务的支持,并且此类实施可能会因提供商而异。
有关实现的更多详细信息,请参阅 https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html。另请参阅 Thunderstore/core/settings.py 了解当前实现的环境变量。
至少设置以下变量:
AWS_ACCESS_KEY_ID
:身份验证密钥 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,默认情况下启用
usermedia API 通过利用 S3 兼容的存储预签名 URL 来处理实际上传。因此,用户媒体后端也必须是 S3 兼容的存储后端。同样,用户媒体存储后端可以配置环境变量:
USERMEDIA_S3_ENDPOINT_URL
:内部可访问的存储服务端点
USERMEDIA_S3_ACCESS_KEY_ID
:身份验证密钥 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 编码服务器 CA。将被放置到server-ca.pem
可以访问docker-compose.yml
中配置的默认本地数据库:
从 shell: docker compose exec db psql -U django
从浏览器:导航到localhost:8080/?pgsql=db&username=django
并使用密码django
您可以通过提供 redis URL 来启用对 redis 后端的缓存
REDIS_URL
:用于缓存的redis数据库URL,例如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