Mirage Sync
Fabric-мод для Minecraft, обеспечивающий инкрементальную синхронизацию измерений между основным и зеркальным серверами Minecraft через постоянное TCP-соединение.
- Загрузчики
- Fabric
- Скачиваний на Modrinth
- 176
- Подписчиков на Modrinth
- 1
- версии
- 3
- Обновлён
- 25 апреля 202625 апр.
- Опубликован
- в 2026
Коротко о моде
Нужен на сервере; в игре — по желанию
![]()
Mirage
Minecraft Fabric мод для инкрементальной синхронизации регионов измерений в реальном времени между основным сервером и одним или несколькими зеркальными серверами.
中文说明
Возможности
| Инкрементальная синхронизация | Сравнение дельт по SHA-256 передаёт только изменённые файлы регионов .mca |
| Netty TCP | Постоянное долгоживущее соединение с автоматическим переподключением на стороне зеркала |
| Атомарная замена файлов | Запись во временный файл с последующим перемещением гарантирует отсутствие повреждений файлов при синхронизации |
| Точность до чанков | Синхронизация отдельных чанков через /mirage sync chunk / /mirage pull chunk |
| Мультиизмерения | Поддержка любого зарегистрированного измерения Minecraft (overworld, nether, end, пользовательские) |
| Синхронизация на лету | Игроки временно кикаются только с целевого зеркала; основной сервер остаётся онлайн |
| Автосинхронизация | Опциональная фоновая синхронизация по расписанию на стороне зеркала (настраиваемый интервал) |
| Защита от кулдауна | Встроенный кулдаун между синхронизациями предотвращает случайную перегрузку серверов |
Архитектура
flowchart LR
subgraph Main["Main Server"]
MS[ServerLevel world]
RH[RegionHasher SHA-256]
SS[MirageSyncServer<br/>Netty TCP :25566]
SM[MainServerTask broadcasts hashes]
end
subgraph Mirror["Mirror Server"]
MR[ServerLevel world]
DC[DeltaComparator diff]
FT[FileTransferManager atomic move]
SC[MirageSyncClient TCP client]
MA[MirrorApplyTask applies changes]
end
MS -->|"flush save"| RH
RH -->|"hash map"| SS
SS -.->|"HASH_LIST_RESP"| SC
SC -->|"FILE_SYNC_START"| DC
DC -->|"file list"| SS
SS -.->|"FILE_CHUNK"| SC
SC -->|"write temp mca"| FT
FT -->|"atomic move"| MR
MA -->|"kick players"| MR
MA -->|"clear cache"| MRПоследовательность синхронизации (запрос инициируется зеркалом):
sequenceDiagram
participant M as Mirror Server
participant S as Main Server
M->>S: HANDSHAKE (authToken)
S-->>M: OK
M->>S: HASH_LIST_REQ
S->>S: flush world, save chunks
S->>S: compute SHA-256 for all .mca files
S-->>M: HASH_LIST_RESP (dimension + hash map)
M->>M: diff with local hashes
alt no differences
M-->>S: SYNC_DONE (no changes)
else files differ
M->>S: FILE_SYNC_START (list of changed files)
loop each file
S-->>M: FILE_CHUNK (512 KB segments, base64)
end
S-->>M: SYNC_DONE
end
M->>M: kick all players in dimension
M->>M: force-save + disable saving
M->>M: force-unload all chunks + clear region cache
M->>M: atomic-move temp files → region dir
M->>M: clear region cache again
M->>M: re-enable world saving
M->>M: sync completeТребования
| Компонент | Версия |
|---|---|
| Minecraft | 1.21.11 |
| Fabric Loader | ≥ 0.18.4 |
| Fabric API | 0.141.3+1.21.11 |
| Java | ≥ 21 |
Установка
Соберите мод
./gradlew buildГотовый jar-файл находится в `build/libs/mirage-.jar`.
Установите на основной и зеркальный серверы
- Поместите jar-файл в папку
mods/каждого сервера. - Оба сервера должны работать на одной версии Minecraft (1.21.11).
- Поместите jar-файл в папку
Первый запуск
- Запустите сервер один раз. Файл
config/mirage.jsonсоздастся автоматически. - Остановите сервер и отредактируйте конфиг (см. ниже).
- Перезапустите сервер.
- Запустите сервер один раз. Файл
Конфигурация
Файл конфигурации: config/mirage.json, создаётся при первом запуске.
Основной сервер
{
"mode": "main",
"syncCooldownSeconds": 30,
"mainServer": {
"port": 25566,
"authToken": "replace-with-a-secure-random-string"
}
}Зеркальный сервер
{
"mode": "mirror",
"syncCooldownSeconds": 30,
"mirrorServer": {
"mainIp": "main-server-ip-or-hostname",
"mainPort": 25566,
"authToken": "replace-with-a-secure-random-string",
"targetDimensions": [
"minecraft:overworld"
],
"autoSyncEnabled": false,
"autoSyncIntervalMinutes": 30
}
}Поля конфигурации
| Поле | По умолчанию | Описание |
|---|---|---|
mode | main | Роль сервера: main или mirror |
syncCooldownSeconds | 30 | Минимальное количество секунд между двумя операциями синхронизации |
mainServer.port | 25566 | TCP-порт для слушателей синхронизации (только основной) |
mainServer.authToken | change-me | Должен точно совпадать с токеном зеркала |
mirrorServer.mainIp | 127.0.0.1 | IP-адрес или имя хоста основного сервера |
mirrorServer.mainPort | 25566 | Порт синхронизации основного сервера |
mirrorServer.authToken | change-me | Должен точно совпадать с токеном основного сервера |
mirrorServer.targetDimensions | [minecraft:overworld] | Измерения для синхронизации при запросе |
mirrorServer.autoSyncEnabled | false | Включить автоматическую синхронизацию по расписанию |
mirrorServer.autoSyncIntervalMinutes | 30 | Интервал между автоматическими синхронизациями (в минутах) |
Внимание:
authTokenдолжен быть одинаковым на обоих серверах — иначе соединения будут отклонены. Замените значение по умолчаниюchange-meна надёжную случайную строку перед использованием.Примечание: Изменения сетевых настроек (
port,mainIp,mainPort) требуют перезапуска сервера.Команды
Все команды уровня администратора требуют уровень прав
OPERATORS.Команды основного сервера
Команда Описание `/mirage sync ` Вычислить и отправить список хешей для одного измерения всем подключённым зеркалам
| /mirage sync all | Разослать списки хешей для всех зарегистрированных измерений | | `/mirage sync chunk | Разослать один чанк по блочным координатам |
|/mirage status| Показать режим, количество подключённых зеркал, состояние синхронизации |
|/mirage reload| Перезагрузитьconfig/mirage.json` с диска |
Команды зеркального сервера
| Команда | Описание |
|---|---|
| `/mirage pull ` | Загрузить одно измерение с основного сервера |
/mirage pull all | Загрузить все измерения, перечисленные в targetDimensions |
| `/mirage pull chunk ` | Загрузить один чанк по блочным координатам |
/mirage status | Показать режим, состояние подключения, состояние синхронизации |
/mirage reload | Перезагрузить config/mirage.json с диска |
Примечание: Игроки в целевом измерении на зеркальном сервере будут кикнуты во время синхронизации.
Структура проекта
src/main/java/xyz/tofumc/ ├── Mirage.java # Точка входа мода, жизненный цикл └── mirage/ ├── command/ │ └── MirageCommand.java # Дерево команд /mirage (brigadier) ├── config/ │ ├── ConfigManager.java # Чтение/запись JSON-конфига │ └── MirageConfig.java # POJO конфига со значениями по умолчанию ├── hash/ │ ├── RegionHasher.java # SHA-256 всех .mca файлов в измерении │ ├── DeltaComparator.java # Сравнение хешей → файлы для скачивания/удаления │ └── FileTransferManager.java # Запись по частям + атомарное перемещение ├── network/ │ ├── protocol/ │ │ ├── MessageType.java # Enum: HANDSHAKE, HASH_LIST_REQ, ... │ │ ├── MirageProtocol.java # Бинарное кодирование/декодирование (ByteBuf codec) │ │ ├── MessagePayloads.java # Определения payload на основе record │ │ └── MirageFrameDecoder.java # 4-байтовая big-endian длина фрейма │ ├── server/ │ │ ├── MirageSyncServer.java # Netty NIO сервер, помощник рассылки │ │ └── ServerHandler.java # Серверный входящий обработчик канала │ └── client/ │ ├── MirageSyncClient.java # Netty TCP клиент, авто-переподключение │ └── ClientHandler.java # Клиентский входящий обработчик канала ├── sync/ │ ├── SyncState.java # Флаг синхронизации + таймер задержки │ ├── MainServerTask.java # Вычисление хешей + рассылка │ ├── MirrorApplyTask.java # Приём + применение файлов / патч чанков в памяти │ └── ScheduledSyncTask.java # Планирование авто-синхронизации (сторона зеркала) ├── util/ │ ├── HashUtil.java # Обёртка SHA-256 дайджеста │ ├── DimensionPathUtil.java # ID измерения → путь к region/директории │ ├── RegionFileUtil.java # Имя .mca файла, смещение чанка, NBT I/O │ └── SyncLogger.java # Логгер с namespace └── world/ ├── WorldSafetyManager.java # Кик игроков, принудительное сохранение, вкл/выкл сохранения └── ChunkUnloader.java # Выгрузка чанков + очистка кеша регионовСборка и релиз
Локальная сборка
./gradlew buildАртефакт: `build/libs/mirage-.jar
Версия читается изgradle.properties(mod_version`, сейчас 1.2.0).CI/CD
Workflow Триггер Действие build.ymlПуш в любую ветку / PR ./gradlew build→ загрузка артефактаrelease.ymlПуш тега v*Обновление mod_versionвgradle.properties→./gradlew build→ публикация GitHub ReleaseУчастие в разработке
Сообщения об ошибках и предложения приветствуются. Пожалуйста, откройте issue перед отправкой pull request.
Настройка для разработки
git clone https://github.com/MRNOBODY-ZST/Mirage.git cd Mirage ./gradlew build # проверить, что компилируетсяFAQ
В: Можно ли запустить несколько зеркал? Да. Основной сервер — это TCP-сервер, любое количество зеркал может подключиться одновременно. Каждое зеркало работает независимо. В: Этот мод работает как прокси BungeeCord/Velocity? Нет. Mirage синхронизирует только файлы регионов мира (
.mca). Он не проксирует подключения игроков или чат. Это инструмент синхронизации миров, а не прокси. В: Что происходит с игроками во время синхронизации? На зеркальном сервере игроки в синхронизируемом измерении кикаются с сообщением и могут сразу переподключиться (мир полностью сохранён и консистентен). Основной сервер продолжает работать нормально — игроки не затронуты. В: Что если синхронизация прервана (например, обрыв сети)? Передача файлов использует атомарную схему временный-файл-затем-перемещение. Если передача прервана на середине, мир зеркала остаётся в предыдущем консистентном состоянии. Повреждений не происходит. Просто запустите `/mirage pullснова после переподключения. **В: Нужно ли устанавливать Fabric API отдельно?** Fabric API объявлен как зависимость вfabric.mod.jsonс версией*, то есть он обязателен. Установите его вместе с Mirage в папкуmods/`.Лицензия
MIT License — см.
LICENSE.Mirage — TofuMC · Minecraft 1.21.11 · Fabric
Частые вопросы
Как установить Mirage Sync?
Установите Fabric под свою версию Minecraft, скачайте Mirage Sync под ту же версию и загрузчик, положите файл в папку mods и запустите игру с профилем загрузчика.
Для каких версий Minecraft есть Mirage Sync?
У Mirage Sync есть сборки для Minecraft 1.21.11.
Нужен ли Mirage Sync на сервере?
Нужен на сервере; в игре — по желанию