Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

セルフホスト同期サーバー

AnkiWebを使用できない、または使用したくない上級ユーザーは、代わりにセルフホスト同期サーバーを使用できます。

注意すべき点:

  • これは上級機能であり、ネットワーキングとコマンドラインに慣れているユーザーを対象としています。これを使用する場合、発生する可能性のあるセットアップ/ネットワーク/ファイアウォールの問題を自分で解決できることが期待され、使用は完全に自己責任となります。
  • 新しいクライアントは同期プロトコルの変更に依存する可能性があるため、サーバーも更新せずにAnkiクライアントを更新すると、同期が機能しなくなる可能性があります。
  • サードパーティの同期サーバーも存在します。それらに対してテストは行われておらず、同期プロトコルが変更されたときに追いつくのに時間がかかる傾向があるため、推奨されません。
  • カスタムサーバーが設定されていても、Anki内のメッセージでは「AnkiWeb」という用語が使用されます(例:サーバーがダウンしているときの「AnkiWebに接続できません」)。

インストール/実行

サーバーをインストールして実行する方法はいくつかあります。次のいずれかを使用できます:

  • デスクトップ版のAnkiにバンドルされている同期サーバー
  • AnkiのGUI依存関係を含まない別の最小限の同期サーバー。PythonとRustの実装が利用可能です。

パッケージビルドから

これは、バージョン2.1.57以降のデスクトップ版のAnkiに組み込まれている同期サーバーを使用します。

Windowsのcmd.exeセッションで:

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

macOSのTerminal.appで:

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

Linuxで:

SYNC_USER1=user:pass anki --syncserver

Pipを使用

デスクトップAnkiのGUI依存関係のダウンロードを避けるため、代わりにPyPIからダウンロードしたPythonパッケージを使用してスタンドアロンのAnki同期サーバーを実行できます。 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

ソースチェックアウトから

GitHubからAnkiリポジトリをクローンした場合、そこからインストールできます:

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

Dockerを使用

ユーザー提供のDockerfileといくつかの手順はこちらにあります。

複数ユーザー

SYNC_USER1は最初のユーザーとパスワードを宣言し、設定する必要があります。 複数のアカウントを設定したい場合は、オプションでSYNC_USER2SYNC_USER3などを宣言できます。

ハッシュ化されたパスワード

上級ユーザーは、プレーンテキストのパスワードの代わりにハッシュ化されたパスワードを使用したい場合があります。これを行う場合は、別のツール(このツールなど)を使用してパスワードハッシュを生成する必要があります。その後、環境変数PASSWORDS_HASHEDを1(または他の値)に設定することで、サーバーにハッシュ化されたパスワードを期待するように指示できます。

ハッシュ化されたパスワードを使用する場合、SYNC_USER変数はusername:password_hash形式であることが期待されます。ここで、password_hashはPHC形式のパスワードのハッシュです。

保存場所

サーバーは、コレクションとメディアのコピーをフォルダに保存する必要があります。 デフォルトでは~/.syncserverです。SYNC_BASE環境変数を定義することでこれを変更できます。

  • これは、サーバーとクライアントが別々のコピーを保存する必要があるため、通常のAnkiデータフォルダと同じ場所であってはなりません。
  • データをサーバーに同期する必要があり、サーバーフォルダにファイルを手動でコピーしてはいけません。

パブリックアクセス

サーバーは暗号化されていないHTTP接続でリッスンするため、インターネットに直接公開することは良いアイデアではありません。使用をローカルネットワークに制限するか、VPN(Tailscaleは簡単らしい)やHTTPSリバースプロキシなど、何らかの形式の暗号化をサーバーの前に配置する必要があります。

SYNC_HOSTSYNC_PORTを定義して、サーバーがバインドするホストとポートを変更できます。

クライアントの設定

コンピュータのネットワークIPアドレスを決定し、各Ankiクライアントをそのアドレスに向ける必要があります。例:http://192.168.1.200:8080/のようなものです。URLは設定で構成できます。

AnkiMobileを使用していて、ローカルネットワーク上のサーバーに接続できない場合は、iOSの設定に移動し、下部近くにあるAnkiを見つけて、「Ankiがローカルネットワークにアクセスすることを許可」をオフにしてから再度オンにしてください。

古いデスクトップクライアントでは、SYNC_ENDPOINTSYNC_ENDPOINT_MEDIAを定義する必要がありました。古いクライアントを使用している場合は、それぞれhttp://192.168.1.200:8080/sync/http://192.168.1.200:8080/msync/のように設定します。2.16より前のAnkiDroidクライアントでは、2つのエンドポイントに対して個別の構成が必要です。

リバースプロキシ

HTTPSアクセスを提供するためにリバースプロキシ(例:nginx)を使用し、サブパスにバインドする場合(例:http://example.com/custom/ -> http://localhost:8080/)、Ankiを構成する際に末尾のスラッシュを含めることを確認する必要があります。代わりにhttp://example.com/customを入力すると、機能しません。

iOSでは、TLS 1.3はサポートされていないため、リバースプロキシでTLS 1.2を有効にする必要があります。そうしないと、「エラーコード-9836」が表示されます。

大きなリクエスト

標準のAnkiWebのアップロード制限がデフォルトで適用されます。制限を増やしたい場合は、オプションでMAX_SYNC_PAYLOAD_MEGSを100より大きい値に設定できます。リバースプロキシを使用している場合は、そこでも制限を調整する必要があるかもしれないことに注意してください。

変更の貢献

このサーバーはAnkiにバンドルされているため、シンプルさが設計目標です - 個人/家族での使用を対象としており、REST APIや外部データベースなどを追加するPRは現時点では受け入れられる可能性が低いです。疑問がある場合は、PRの作業を開始する前にご連絡ください。

既存のAPIソリューションを探している場合は、AnkiConnectアドオンがニーズを満たすかもしれません。