Раздача ресурсов RAGE:MP через собственное S3-совместимое хранилище

Материал из Википедия MyArena.ru
Перейти к: навигация, поиск

Раздача ресурсов RAGE:MP через self-hosted S3 (fastdl)

Инструкция описывает, как поднять self-hosted S3-хранилище (MinIO) в Docker на отдельном Linux-сервере и настроить RAGE:MP-сервер так, чтобы клиенты качали ресурсы (client_packages) с этого хранилища, а не с самого игрового сервера.

Описание

Схема:

Игрок           ->  MinIO (S3 API, порт 9000, публичный анонимный доступ на чтение)
Игровой сервер  ->  fastdl_snapshot -> заливка в MinIO через AWS CLI (S3 API)
  • MinIO разворачивается в Docker, S3 API слушает порт 9000.
  • Бакет с ресурсами открыт на анонимное скачивание - RAGE:MP-клиент качает файлы обычным GET, без авторизации.
  • Заливка ресурсов выполняется с Windows-сервера через aws s3 sync, вручную или по расписанию.

Требования

  • Linux-сервер, Ubuntu 24.04, с установленным Docker - под S3-хранилище.
  • Windows-сервер с RAGE:MP - игровой сервер, отсюда же выполняется заливка ресурсов.
  • Порт 9000 открыт наружу на Linux-сервере (S3 API).

Установка Docker (Ubuntu 24.04)

sudo apt update
sudo apt install -y docker.io
sudo systemctl enable --now docker

Запуск MinIO

MINIO_ROOT_PASSWORD=$(openssl rand -hex 16)
echo "root password: $MINIO_ROOT_PASSWORD"

docker run -d --name minio \
  --restart unless-stopped \
  -p 9000:9000 -p 9001:9001 \
  -e MINIO_ROOT_USER=ragempadmin \
  -e MINIO_ROOT_PASSWORD="$MINIO_ROOT_PASSWORD" \
  -v minio-data:/data \
  pgsty/minio:latest server /data --console-address ":9001"
  • --restart unless-stopped - контейнер поднимается автоматически после перезагрузки сервера.
  • -p 9000:9000 - S3 API. Сюда стучится и заливка ресурсов, и игроки при скачивании.
  • -p 9001:9001 - веб-консоль администратора.
  • -v minio-data:/data - данные в отдельном docker-volume, переживают пересоздание контейнера.
  • $MINIO_ROOT_PASSWORD выводится один раз и больше нигде не хранится - сохранить сразу.

Создание бакета, пользователя и публичного доступа

Выполняется через одноразовые контейнеры minio/mc, подключённые к сети контейнера minio.

UPLOADER_SECRET=$(openssl rand -hex 16)
echo "uploader secret: $UPLOADER_SECRET"

MC_AUTH="MC_HOST_local=http://ragempadmin:${MINIO_ROOT_PASSWORD}@localhost:9000"

docker run --rm --network container:minio -e "$MC_AUTH" minio/mc mb local/ragemp
docker run --rm --network container:minio -e "$MC_AUTH" minio/mc anonymous set download local/ragemp
docker run --rm --network container:minio -e "$MC_AUTH" minio/mc admin user add local ragemp-uploader "$UPLOADER_SECRET"
docker run --rm --network container:minio -e "$MC_AUTH" minio/mc admin policy attach local readwrite --user ragemp-uploader
Команда Назначение
mb local/ragemp создаёт бакет ragemp
anonymous set download разрешает скачивание объектов из бакета без авторизации
admin user add создаёт пользователя ragemp-uploader с secret key для заливки файлов
admin policy attach ... readwrite даёт пользователю права на чтение и запись в бакет

Проверка (на Linux-сервере)

docker run --rm --network container:minio -e "$MC_AUTH" minio/mc ls local
docker run --rm --network container:minio -e "$MC_AUTH" minio/mc admin user list local

Первая команда должна показать бакет ragemp, вторая - пользователя ragemp-uploader.

Установка AWS CLI на Windows (игровой сервер)

PowerShell от администратора:

msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi /qn

Закрыть и заново открыть терминал, проверить:

aws --version

Настройка учётных данных AWS CLI

aws configure
  • AWS Access Key ID: ragemp-uploader
  • AWS Secret Access Key: значение $UPLOADER_SECRET, полученное на шаге создания пользователя
  • Default region name: us-east-1 (MinIO регион строго не проверяет, поле не должно быть пустым)
  • Default output format: json

Настройка RAGE:MP-сервера

В conf.json:

"fastdl-host": "http://<IP_Linux_сервера>:9000/ragemp/",
"create-fastdl-snapshot": true

Перезапустить сервер - в директории сервера появится папка fastdl_snapshot.

Заливка ресурсов

Выполняется на Windows-сервере после каждого обновления ресурсов:

aws --endpoint-url http://<IP_Linux_сервера>:9000 s3 sync fastdl_snapshot\ s3://ragemp/

s3 sync заливает только новые и изменённые файлы, а не всю папку заново при каждом запуске.

Проверка отдачи файлов

curl -I http://<IP_Linux_сервера>:9000/ragemp/file/<id>

Ожидается 200 OK без заголовков авторизации - именно так к файлу обращается RAGE:MP-клиент.