Резервные копии и обновления

Что нужно резервировать, как восстановить данные на новом хосте, как обновить систему и как перенести сервер Mattermost или отдельное сообщество на Antimatter.

Что нужно резервировать

ЧтоС файлом compose сайтаС архивом релизаС пакетом .deb или .rpm
База данных: сообщения, пользователи, сообщества, каналы и, при использовании файла compose сайта, конфигурациятом antimatter_postgres, через pg_dumpваша база данных PostgreSQLваша база данных PostgreSQL
Загруженные файлы, изображения и установленные приложениятом antimatter_files (хранилище S3)FileSettings.Directory, по умолчанию ./data//var/lib/antimatter
Файл конфигурации(в базе данных)config/config.json/etc/antimatter/config/config.json
GIF и стикерытом antimatter_gifsкаталог данных службы GIF/var/lib/gifs-server
Секретные данные.env (и compose.override.yaml)ваш файл переменных окружения/etc/antimatter/antimatter.env, /etc/gifs-server
Ключ шифрования ИИ, который шифрует ключи подключений к моделямAM_AI_ENCRYPTION_KEY в .env (рекомендуется) или файл ai-encryption.key в томе antimatter_dataAM_AI_ENCRYPTION_KEY или data/ai-encryption.keyAM_AI_ENCRYPTION_KEY в antimatter.env или /var/lib/antimatter/data/ai-encryption.key

Без ключа шифрования ИИ восстановленный сервер не сможет прочитать API-ключи подключений к моделям, и каждый из них придётся ввести заново. Храните копию ключа отдельно от резервных копий базы данных, чтобы в одной украденной копии не оказались и то, и другое. См. Ключ шифрования.

База данных и файлы неразделимы: резервируйте их одновременно и храните копии вне сервера. Имена томов начинаются с имени проекта compose, antimatter (список можно получить командой docker volume ls).

Резервное копирование

Выполняйте из каталога с compose.yaml. Предварительная остановка Antimatter обеспечивает полностью согласованную копию; резервная копия, сделанная во время работы, обычно тоже подходит, но файлы, загруженные в процессе резервного копирования, могут в ней отсутствовать.

stamp=$(date +%Y%m%d-%H%M%S)
mkdir -p backups
docker compose stop antimatter
# Database
docker compose exec -T postgres pg_dump -U antimatter -d antimatter -Fc \
    > "backups/antimatter-db-$stamp.dump"
# File storage, GIF service and the data directory (the AI key file)
for v in files gifs data; do
    docker run --rm -v "antimatter_$v:/data:ro" -v "$PWD/backups:/backup" \
        alpine tar -czf "/backup/antimatter-$v-$stamp.tar.gz" -C /data .
done
docker compose start antimatter
# Secrets
cp .env "backups/env-$stamp"

Если вы не задали AM_AI_ENCRYPTION_KEY, файл ключа сервера находится в томе data, который цикл выше сохраняет вместе с файлами. Лучше поместить его содержимое в .env, как объясняется в разделе Ключ шифрования, и хранить копию отдельно от резервных копий базы данных.

Запускайте из cron для ежедневного резервного копирования и копируйте каталог backups/ на другой компьютер. Храните копии .env так же безопасно, как и сам сервер: в них содержатся пароли.

Чтобы копировать загруженные файлы по одному (например, в другое хранилище S3), используйте командную утилиту AWS службы bucket:

docker compose run --rm -v "$PWD/backups/files:/backup" bucket \
    "aws --endpoint-url http://files:9000 s3 sync s3://antimatter /backup"

При использовании архива релиза резервируйте базу данных с помощью pg_dump -Fc, а каталоги data/ и config/ — с помощью обычных инструментов (data/ содержит файл ключа ИИ). При использовании пакетов резервируйте базу данных тем же способом, а также /etc/antimatter, /var/lib/antimatter, /etc/gifs-server и /var/lib/gifs-server.

Восстановление на новом хосте

Поместите compose.yaml, сохранённый .env и резервные копии в новый каталог, затем:

stamp=20261016-030000          # the backup to restore
docker compose create           # creates the volumes, starts nothing
docker compose up -d postgres
docker compose exec -T postgres pg_restore -U antimatter -d antimatter --no-owner \
    < "backups/antimatter-db-$stamp.dump"
for v in files gifs data; do
    docker run --rm -v "antimatter_$v:/data" -v "$PWD/backups:/backup" \
        alpine tar -xzf "/backup/antimatter-$v-$stamp.tar.gz" -C /data
done
docker compose up -d

Используйте тот же .env: хранилище и база данных должны сохранить прежние пароли, а подключениям к моделям нужен тот же ключ шифрования ИИ. Если у нового хоста другой адрес, обновите SITE_URL (и DOMAIN).

Периодически проверяйте резервные копии, восстанавливая их на другом компьютере.

Обновление

Файлы Compose, загруженные до 17 октября 2026 года, не имели тома data: файл ключа ИИ находился в контейнере. Прежде чем использовать новый compose.yaml, и если в .env нет AM_AI_ENCRYPTION_KEY, сохраните ключ, созданный сервером: echo "AM_AI_ENCRYPTION_KEY=$(docker compose exec -T antimatter cat /antimatter/data/ai-encryption.key)" >> .env. Если команда не находит файл, ни одно подключение к модели ещё не сохранило ключ.
  1. Сделайте резервную копию.
  2. Измените тег образа в .env (ANTIMATTER_IMAGE), если вы фиксируете версию, как рекомендуется.
  3. Загрузите и перезапустите:
    docker compose pull
    docker compose up -d
    docker compose logs -f antimatter

При запуске сервер обновляет схему базы данных (процесс можно отслеживать в журнале; на большом сервере это может занять несколько минут) и устанавливает более новые версии приложений, входящих в образ. При использовании архива релиза: остановите сервер, замените всё, кроме config/, data/, logs/, plugins/ и client/plugins/, содержимым нового архива, а затем запустите сервер снова. При использовании пакета .deb или .rpm установите новый пакет, как описано в разделе Обновление пакета.

Обновления выполняются только вперёд. Как только более новая версия сервера обновит базу данных, старая версия не сможет её использовать: чтобы откатиться, восстановите резервную копию, сделанную перед обновлением. То же самое относится к переходу с antimatter-next обратно на antimatter.

Версии

Сервер Antimatter сообщает версию линейки Mattermost, на которой он основан (на данный момент 12.0.0). Релизы на GitHub, включая их архивы и пакеты, имеют собственные номера версий: в период бета-тестирования это серия 0.9.0. Команда antimatter version отображает её как Номер сборки. Образы пересобираются из веток main: antimatter-next — каждую ночь (теги nightly-<YYYYMMDD>), а оба образа — при каждом изменении (теги sha-<commit>). Закрепите один из этих тегов, обновляйте систему осознанно и записывайте предыдущий тег, чтобы знать, какая резервная копия ему соответствует.

Основные версии PostgreSQL

Файл compose использует postgres:17-alpine. Antimatter требует PostgreSQL 15 или новее. Новая основная версия PostgreSQL не может читать каталог данных предыдущей версии: чтобы перейти на неё, сделайте дамп базы данных, запустите новую версию на новом томе и восстановите дамп в неё.

Обновление до версии 0.9.0

Первый запуск версии 0.9.0 (или образа, собранного 17 октября 2026 года или позже) вносит несколько одноразовых изменений в данные. Каждое изменение выполняется один раз и записывается в базу данных. Они приводят значения, оставшиеся на старых значениях по умолчанию, к новым, при этом не затрагивая параметры, которые администратор выбрал вручную. Отслеживайте эти изменения в журнале.

Если Antimatter используется в компании или организации, установите значение Тип новых сообществ в Компания до обновления: AM_TEAMSETTINGS_DEFAULTCOMMUNITYKIND=workplace. При обновлении каждому сообществу будет присвоен тип, соответствующий значению этого параметра в момент обновления, а звонки по умолчанию будут отключены в каналах сообществ типа Сообщество. См. Компания или сообщество.
ЧтоИзменение
Типы сообществКаждое сообщество получает тип — Сообщество или Компания: значение параметра Тип новых сообществ (TeamSettings.DefaultCommunityKind) при первом запуске. Уже установленный тип сохраняется. Администраторы сообществ могут впоследствии изменить тип своего сообщества в разделе Параметры команды › Каналы › Тип сообщества.
Кто архивирует каналыУчастники каналов больше не архивируют каналы, в которых состоят: это делают администраторы сообществ. На рабочем месте каналы архивируют администраторы канала (тот, кто его создал, и те, кого он назначил администраторами). Это изменяет роли системной схемы; схемы разрешений, созданные системным администратором для некоторых сообществ, остаются без изменений.
Роль «Модераторы» в пресетах макетаРоль Модераторы, которую сообщества получили из пресета макета, получает Удаление участников, что необходимо для приостановки и удаления участников. Изменяются только те роли, которые полностью соответствуют пресету; роли, отредактированные пользователем, остаются без изменений.
Роли с АдминистраторРоль сообщества с включённым переключателем Администратор теперь предоставляет все возможности, доступные администраторам сообщества, как и указано в переключателе, а не только управление настройками сообщества.
Лимит участниковМакс. количество участников в сообществе (TeamSettings.MaxUsersPerTeam) изменяется со значения 50 (предыдущее значение по умолчанию) до 0 (без ограничений). Любое другое значение сохраняется, как и лимит, установленный с помощью AM_TEAMSETTINGS_MAXUSERSPERTEAM.
Подключения моделейСистемные администраторы получают управление подключениями моделей, а администраторы сообществ (и роли с Администратор) — управление подключениями моделей их собственного сообщества. Сервисы ИИ приложения Agents становятся общесерверными подключениями моделей, см. ниже.
Town Square переименовывается в GeneralКанал по умолчанию в каждом сообществе переименовывается из town-square (Town Square) в general (General). Он сохраняет свой ID, участников, сообщения и настройки, а также отображаемое имя, выбранное администраторами. Старые ссылки и запросы по town-square по-прежнему ведут к нему. Сообщество, в котором уже есть канал с именем general (даже если он архивирован), сохраняет town-square в качестве канала по умолчанию, как и сообщество, в котором town-square архивирован: они упоминаются в журнале, а их администраторы могут переименовать каналы.
ИзбранноеКатегория боковой панели «Избранное» у всех пользователей переименовывается в «Избранное», как теперь указано в интерфейсе. Категории, созданные пользователями с этим именем, остаются без изменений.

Сервисы приложения Agents

При обновлении каждая служба ИИ приложения Agents копируется в серверное подключение к модели, которое становится общим для всего рабочего пространства и доступно всем, кроме гостей (чтобы разрешить доступ гостям, включите Guests too). Ключи шифруются при передаче, поэтому серверу нужен ключ шифрования ИИ: если файлы кластера хранятся в S3, сначала задайте AM_AI_ENCRYPTION_KEY, иначе копирование отложится до следующего запуска. Затем проверьте Системная консоль › AI › Model connections:

  • Каждое подключение сохраняет идентификатор своей службы, поэтому агенты приложения и автоматический перевод, настроенный на службу Agents, по-прежнему смогут её найти.
  • Службы OpenAI, совместимые с OpenAI, Anthropic, Mistral, Cohere и Gemini становятся подключениями к их конечным точкам, совместимым с OpenAI (или Anthropic). Служба Azure становится подключением к конечной точке ресурса, совместимой с OpenAI: протестируйте её.
  • Службы AWS Bedrock, Google Vertex AI и Cohere North, а также типы, которые не удалось определить, помечаются как Needs attention с указанием причины. Их облачные учётные данные не копируются: укажите для них конечную точку провайдера, совместимую с OpenAI, или шлюз, например LiteLLM, и сохраните изменения.
  • Служба эмбеддингов становится моделью Embeddings подключения с тем же адресом и ключом или отдельным подключением. Служба транскрипции получает модель whisper-1.
  • Если для переписывания и кратких выводов подключение ещё не настроено, они получают службу и модель агента по умолчанию из приложения.

Собственные параметры и данные приложения Agents остаются без изменений: его агенты продолжают использовать его службы.

Другие изменения параметров по умолчанию

  • Звонки: Test mode выключен, а Enable video включено по умолчанию. Выбор, сохранённый в конфигурации, сохраняется. Звонки также зависят от типа рабочего пространства (см. Calls and voice).
  • Функция закрепления сообщений наверху доступна администраторам канала, администраторам и модераторам рабочего пространства (с правом Управление сообщениями); участники личных и групповых сообщений по-прежнему могут закреплять сообщения.
  • В архивированные каналы можно добавлять новых участников, которые смогут читать историю. Никто не может публиковать сообщения, добавлять реакции или вносить какие-либо изменения в них.

Переход с Mattermost

Antimatter использует схему базы данных Mattermost и добавляет собственные таблицы, поэтому он может взять на себя PostgreSQL-базу данных и файлы сервера Mattermost. Сначала попробуйте это на копии:

  1. Сделайте резервную копию базы данных Mattermost, его хранилища файлов (data/ или S3-бакета) и config.json, затем остановите Mattermost.
  2. Восстановите базу данных в PostgreSQL Antimatter или укажите Antimatter на её копию (AM_SQLSETTINGS_DATASOURCE).
  3. Скопируйте файлы в хранилище Antimatter, сохранив их пути: в бакет antimatter с помощью S3-инструмента или в data/ с помощью архива релиза.
  4. Переиспользуйте свои настройки: скопируйте config.json или перенесите его в базу данных с помощью amctl --local config migrate (см. Конфигурация). Ваши переменные окружения MM_ продолжают работать; переименуйте их в AM_, когда будет удобно.
  5. Запустите Antimatter и следите за журналом во время обновления базы данных. Затем откройте Системная консоль › Плагины › Управление плагинами. Antimatter устанавливает собственные сборки Calls, Playbooks, Kanban (Boards), Agents и интеграций, если они новее установленных версий. Если в Mattermost была более новая версия одного из этих приложений, удалите его и перезапустите Antimatter, чтобы установилась его собственная сборка.
  6. Настройте push-уведомления заново, используя собственный push-прокси: Antimatter никогда не отправляет уведомления в push-сервисы Mattermost, будь то тестовые или хостинговые, поскольку они доставляются только в собственные приложения Mattermost. Пока вы не измените Сервер push уведомлений, сервер не отправляет push-уведомления (см. Push-уведомления).

Antimatter не связывается ни с одним сервисом, управляемым Mattermost, Inc. (см. Соединения с внешними сервисами), даже если в вашей конфигурации они все еще указаны:

  • push-сервер Mattermost сохраняется в настройках, но никогда не используется;
  • адреса Mattermost для магазина приложений (URL магазина плагинов) и для продуктовых объявлений очищены;
  • ссылки на загрузку приложений, которые по умолчанию указывали на Mattermost (Antimatter Apps Download Page Link, Ссылка на страницу загрузки приложения для Android и Ссылка на страницу загрузки приложения для iOS), заменены на страницы загрузки приложений Antimatter на GitHub; ссылки, которые вы задали самостоятельно, сохраняются;
  • приложение Calls использует публичный STUN-сервер Cloudflare вместо сервера Mattermost, не изменяя сохраненную настройку (см. Calls);
  • проверка обновлений безопасности и отчёт о сбоях удалены, а вместе с ними — параметры Системной консоли (Включить уведомления о безопасности, Включить диагностику и отчёт об ошибках) и страница Объявления.

Сокет локального режима теперь /var/tmp/antimatter_local.socket; amctl также пытается использовать старый /var/tmp/mattermost_local.socket. Mattermost поддерживает только PostgreSQL в последних версиях, и Antimatter делает то же самое: сначала перенесите базу данных MySQL в PostgreSQL. Возврат к Mattermost после обновления базы данных Antimatter означает восстановление резервной копии Mattermost.

Экспорт и импорт данных

Формат пакетного экспорта переносит данные между серверами: весь сервер, некоторые сообщества или некоторые каналы, включая вложения, аватары и пользовательские эмодзи, если вы этого хотите.

# on the source server
amctl export create --team-name design --include-profile-pictures
amctl export list
amctl export download <export file> design.zip
# on the destination server
amctl import upload design.zip
amctl import list available
amctl import process <uploaded file> --imported-users active

Следите за выполнением задач с помощью команд amctl export job list и amctl import job list. Для экспорта сообщества или канала требуется параметр --imported-users: active, если пользователи переезжают на этот сервер, и inactive, если импорт выполняется на сервер, где у них уже есть аккаунты, чтобы аккаунты, созданные из неоднозначных совпадений, оставались неактивными до проверки администратором. Параметр --destination-team-name позволяет импортировать данные в существующее сообщество. Файлы экспорта и импорта хранятся на диске сервера (ExportSettings.Directory, ImportSettings.Directory) в течение 30 дней по умолчанию.

На самом сервере команды antimatter export bulk и antimatter import bulk --apply выполняют те же операции из файлов, минуя API.