Свой сервер синхронизации

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

Важные моменты, которые следует учитывать:

  • Это расширенная функция, предназначенная для пользователей, которые хорошо разбираются в работе с сетями и командной строкой. Если вы её используете, предполагается, что вы сможете самостоятельно решить любые возникающие проблемы с настройкой, сетью или брандмауэром. Использование этой функции осуществляется полностью на ваш страх и риск.
  • Новые клиенты могут зависеть от изменений в протоколе синхронизации, поэтому синхронизация может перестать работать, если вы обновите свои клиенты Anki, не обновив при этом сервер.
  • Существуют также сторонние серверы синхронизации. Они не тестируются разработчиками Anki и, как правило, требуют времени для адаптации при изменениях протокола синхронизации, поэтому их использование не рекомендуется.
  • Сообщения внутри Anki будут использовать термин «AnkiWeb», даже если настроен пользовательский сервер (например, сообщение «Не удается подключиться к AnkiWeb», когда ваш сервер не работает).

Установка/запуск

Существует несколько способов установки и запуска сервера. Вы можете использовать:

  • сервер синхронизации, встроенный в десктопную версию Anki;
  • отдельный минималистичный сервер синхронизации, который не включает зависимости графического интерфейса Anki. Доступны реализации на Python и Rust.

Из готового пакета

В этом случае используется сервер синхронизации, встроенный в десктопную версию Anki, начиная с версии 2.1.57+.

На Windows, в сессии cmd.exe:

set SYNC_USER1=user:pass
"\Program Files\anki\anki-console" --syncserver

На macOS, в Terminal.app:

SYNC_USER1=user:pass /Applications/Anki.app/Contents/MacOS/launcher --syncserver

Замените 'launcher' на 'anki' для старых версий пакетов до 25.07.

На Linux:

SYNC_USER1=user:pass anki --syncserver

С помощью Pip

Чтобы избежать загрузки зависимостей графического интерфейса десктопного Anki, вы можете запустить автономный сервер синхронизации Anki, используя пакет Python, загруженный из PyPI. Убедитесь, что у вас установлен Python 3.9+.

python3 -m venv ~/syncserver
~/syncserver/bin/pip install anki
SYNC_USER1=user:pass ~/syncserver/bin/python -m anki.syncserver

С помощью Cargo

Начиная с Anki 2.1.66+, вы также можете собрать реализацию автономного сервера синхронизации на Rust с помощью приведённой ниже команды. Убедитесь, что у вас установлен Rustup.

cargo install --locked --git https://github.com/ankitects/anki.git --tag 25.02.5 anki-sync-server

Замените 25.02.5 на последнюю доступную версию Anki.

Также необходимо будет установить Protobuf (protoc).

После сборки вы можете запустить сервер командой:

SYNC_USER1=user:pass anki-sync-server

Из исходного кода

Если вы клонировали репозиторий Anki с GitHub, вы можете установить сервер оттуда:

./ninja extract:protoc ftl_repo
cargo install --path rslib/sync

С помощью Docker

Пользовательский Dockerfile и некоторые инструкции можно найти здесь.

Несколько пользователей

Переменная SYNC_USER1 задаёт имя и пароль первого пользователя и обязательна для установки. При необходимости вы можете дополнительно объявить SYNC_USER2, SYNC_USER3 и т.д., чтобы настроить несколько учётных записей.

Хеширование паролей

Продвинутые пользователи могут захотеть использовать хешированные пароли вместо паролей в открытом виде. Если вы хотите сделать это, вам понадобится отдельный инструмент (например, этот) для генерации хеша пароля. Затем вы можете указать серверу использовать хешированные пароли, установив переменную окружения PASSWORDS_HASHED в значение 1 (или любое другое).

При использовании хешированных паролей ожидается, что переменные SYNC_USER будут в формате имя_пользователя:хеш_пароля, где хеш_пароля — это хеш пароля в PHC формате.

Расположение данных

Серверу необходимо хранить копию вашей коллекции и медиафайлов в папке. По умолчанию это ~/.syncserver; вы можете изменить это, определив переменную окружения SYNC_BASE.

  • Это не должно быть то же самое место, что и ваша обычная папка с данными Anki, поскольку сервер и клиент должны хранить отдельные копии.
  • Вы должны синхронизировать свои данные с сервером, а не копировать файлы в папку сервера вручную.

Публичный доступ

Сервер работает по незашифрованному HTTP-соединению, поэтому не рекомендуется напрямую открывать его доступ в интернет. Вам следует либо ограничить использование вашей локальной сетью, либо разместить перед сервером какое-либо средство шифрования, например VPN (Tailscale считается простым вариантом) или HTTPS обратный прокси.

Вы можете определить переменные SYNC_HOST и SYNC_PORT, чтобы изменить хост и порт, к которым привязывается сервер.

Настройка клиента

Вам нужно будет определить IP-адрес вашего компьютера в сети, а затем указать этот адрес каждому из ваших клиентов Anki, например, что-то вроде http://192.168.1.200:8080/. URL можно настроить в настройках клиента.

Если вы используете AnkiMobile и не можете подключиться к серверу в вашей локальной сети, пожалуйста, зайдите в настройки iOS, найдите Anki внизу списка и переключите опцию "Разрешить Anki доступ к локальной сети" — сначала выключите, а затем снова включите.

Более старые десктопные клиенты требовали определения переменных SYNC_ENDPOINT и SYNC_ENDPOINT_MEDIA. При использовании старого клиента вы должны были указать их, например, http://192.168.1.200:8080/sync/ и http://192.168.1.200:8080/msync/ соответственно. Клиенты AnkiDroid версий до 2.16 также требуют отдельной настройки этих двух конечных точек.

Обратные прокси

Если вы используете обратный прокси для обеспечения доступа по HTTPS (например, nginx) и привязываете его к подпути (например, http://example.com/custom/ -> http://localhost:8080/), вы должны обязательно включать закрывающий слеш при настройке Anki. Если вы укажете http://example.com/custom без слеша, это не будет работать.

На iOS не поддерживается TLS 1.3, поэтому ваш обратный прокси должен иметь включённый TLS 1.2, иначе вы получите "error code -9836".

Большие запросы

По умолчанию применяется стандартное ограничение AnkiWeb на размер загружаемых данных. При желании вы можете установить переменную MAX_SYNC_PAYLOAD_MEGS в значение больше 100, чтобы увеличить лимит. Имейте в виду, что если вы используете обратный прокси, вам также может потребоваться настроить лимит и там.

Внесение изменений

Поскольку этот сервер поставляется вместе с Anki, простота является одной из целей дизайна — он ориентирован на индивидуальное или семейное использование. Pull Request'ы, добавляющие такие функции, как REST API или внешние базы данных, в настоящее время вряд ли будут приняты. Если сомневаетесь, пожалуйста, свяжитесь с разработчиками перед началом работы над PR.

Если вы ищете готовое API-решение, дополнение AnkiConnect может удовлетворить ваши потребности.