Свой сервер синхронизации
Продвинутые пользователи, которые не могут или не хотят использовать 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 может удовлетворить ваши потребности.