سرور همگام‌سازی خودمیزبان

کاربران پیشرفته‌ای که نمی‌توانند یا نمی‌خواهند از AnkiWeb استفاده کنند، می‌توانند به‌جای آن از سرور همگام‌سازی خودمیزبان استفاده کنند.

چیزهایی که باید بدانید:

  • این قابلیتی پیشرفته است و متوجه کاربرانی است که با شبکه و خط فرمان راحت‌اند. اگر از آن استفاده می‌کنید، انتظار این است که هر مشکلی در راه‌اندازی/شبکه/فایروال که به آن می‌خورید خودتان حل کنید، و استفاده از آن کاملاً روی مسئولیت خودتان است.
  • کلاینت‌های جدیدتر ممکن است به تغییرات پروتکل همگام‌سازی وابسته باشند؛ پس اگر کلاینت‌های آنکی‌تان را بدون به‌روزرسانی سرور به‌روزرسانی کنید، ممکن است همگام‌سازی از کار بیفتد.
  • سرورهای همگام‌سازی شخص ثالث هم وجود دارند. آزمایشی علیه آن‌ها انجام نمی‌شود و وقتی پروتکل همگام‌سازی تغییر می‌کند معمولاً دیر به‌روز می‌شوند؛ پس توصیه نمی‌شوند.
  • پیام‌های درون آنکی حتی اگر سرور سفارشی پیکربندی شده باشد از واژه "AnkiWeb" استفاده می‌کنند (مثلاً "Cannot connect to AnkiWeb" وقتی سرور شما از کار افتاده است).

نصب/اجرا

راه‌های مختلفی برای نصب و اجرای سرور هست. می‌توانید از هر کدام استفاده کنید:

  • سرور همگام‌سازی همراه نسخه دسکتاپ آنکی
  • سرور همگام‌سازی مینیمال جداگانه که وابستگی‌های GUI آنکی را در بر ندارد. پیاده‌سازی Python و Rust موجود است.

از بسته بسته‌بندی‌شده

این از سرور همگام‌سازی داخلی نسخه دسکتاپ آنکی از نسخه 2.1.57+ استفاده می‌کند.

در ویندوز، در نشست 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/anki --syncserver

برای نسخه‌های 25.07 تا 25.09.4، 'anki' را با 'launcher' جایگزین کنید.

یا لینوکس:

SYNC_USER1=user:pass anki --syncserver

با Pip

برای پرهیز از دانلود وابستگی‌های GUI آنکی دسکتاپ، می‌توانید به‌جای آن سرور همگام‌سازی مستقل آنکی را با بسته 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

از آنکی 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 را با آخرین نسخه آنکی جایگزین کنید.

Protobuf (protoc) باید نصب باشد.

پس از ساخت، می‌توانید آن را با دستور زیر اجرا کنید:

anki-sync-server

و اجرا کنید.

از سورس چک‌اوت‌شده

اگر مخزن آنکی را از GitHub کلون کرده‌اید، می‌توانید از همان‌جا نصب کنید:

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

با Docker

می‌توانید Dockerfile مشارکت‌شده کاربری و مقداری دستورالعمل را اینجا بیابید.

چند کاربر

SYNC_USER1 نخستین کاربر و گذرواژه را اعلام می‌کند و باید تنظیم شود. در صورت تمایل به راه‌اندازی چند حساب، می‌توانید SYNC_USER2، SYNC_USER3 و به همین ترتیب را هم اعلام کنید.

گذرواژه‌های درهم‌سازی‌شده

کاربران پیشرفته شاید بخواهند به‌جای گذرواژه‌های متن ساده از گذرواژه‌های درهم‌سازی‌شده استفاده کنند. اگر مایل به این کار هستید، باید از ابزاری جداگانه (مانند این ابزار) برای تولید درهم‌سازی گذرواژه استفاده کنید. سپس با تنظیم متغیر محیطی PASSWORDS_HASHED روی ۱ (یا هر مقدار دیگر) به سرور بگویید گذرواژه‌های درهم‌سازی‌شده انتظار داشته باشد.

وقتی گذرواژه‌های درهم‌سازی‌شده استفاده می‌شوند، انتظار می‌رود متغیرهای SYNC_USER به قالب username:password_hash باشند، که password_hash درهم‌سازی گذرواژه در قالب PHC است.

محل ذخیره‌سازی

سرور باید رونوشتی از مجموعه و رسانه‌هایتان را در پوشه‌ای ذخیره کند. به‌طور پیش‌فرض ~/.syncserver است؛ می‌توانید با تعریف متغیر محیطی SYNC_BASE آن را تغییر دهید.

  • این نباید همان محل پوشه داده عادی آنکی شما باشد، چون سرور و کلاینت باید رونوشت‌های جداگانه ذخیره کنند.
  • باید داده‌هایتان را با سرور همگام کنید، نه اینکه پرونده‌ها را به‌طور دستی در پوشه سرور رونوشت کنید.

دسترسی عمومی

سرور روی اتصال HTTP رمزنگاری‌نشده گوش می‌دهد؛ پس ایده خوبی نیست که آن را مستقیماً در معرض اینترنت بگذارید. یا استفاده را به شبکه محلی‌تان محدود می‌کنید، یا شکلی از رمزنگاری را پیش از سرور می‌گذارید؛ مانند VPN (ظاهراً Tailscale آسان است)، یا پروکسی معکوس HTTPS.

می‌توانید SYNC_HOST و SYNC_PORT را برای تغییر میزبان و پورتی که سرور به آن مقید می‌شود تعریف کنید.

راه‌اندازی کلاینت

نشانی سرور

باید نشانی IP شبکه رایانه‌تان را تعیین کنید و سپس هر یک از کلاینت‌های آنکی‌تان را به آن نشانی اشاره دهید؛ مانند http://192.168.1.200:8080/. نشانی را می‌توان در تنظیمات پیکربندی کرد.

اگر از AnkiMobile استفاده می‌کنید و نمی‌توانید به سروری روی شبکه محلی‌تان وصل شوید، لطفاً به تنظیمات iOS بروید، Anki را نزدیک پایین بیابید، و "Allow Anki to access local network" را خاموش و دوباره روشن کنید.

کلاینت‌های دسکتاپ قدیمی‌تر نیاز داشتند SYNC_ENDPOINT و SYNC_ENDPOINT_MEDIA را تعریف کنید. اگر از کلاینت قدیمی‌ای استفاده می‌کنید، آن را مثلاً به‌صورت http://192.168.1.200:8080/sync/ و http://192.168.1.200:8080/msync/ به‌ترتیب می‌گذارید. کلاینت‌های AnkiDroid پیش از 2.16 به پیکربندی جداگانه برای دو نقطه پایانی نیاز دارند.

اعتبارنامه‌ها

برای توانایی همگام‌سازی، اعتبار کاربری‌تان (مثلاً SYNC_USER1) را در بخش AnkiWeb account تنظیمات بگذارید.

پروکسی‌های معکوس

اگر از پروکسی معکوس برای فراهم‌کردن دسترسی HTTPS استفاده می‌کنید (مثلاً nginx) و به زیرمسیری مقید می‌شوید (مثلاً http://example.com/custom/ -> http://localhost:8080/)، باید مطمئن شوید هنگام پیکربندی آنکی اسلش انتهایی را بیاورید. اگر به‌جایش http://example.com/custom بگذارید، کار نخواهد کرد.

اگر از caddy استفاده می‌کنید، اندازه بافر خواندن http را افزایش دهید تا هنگام دانلود پرونده‌های رسانه مشکل اتصالی پیش نیاید.

reverse_proxy http://127.0.0.1:8080 {
	transport http {
		read_buffer 512k
	}
}

در iOS، TLS 1.3 پشتیبانی نمی‌شود؛ پس پروکسی معکوس شما باید TLS 1.2 را فعال داشته باشد، وگرنه «error code -9836» می‌گیرید.

درخواست‌های بزرگ

حد استاندارد AnkiWeb بر بارگذاری‌ها به‌طور پیش‌فرض اعمال می‌شود. در صورت تمایل می‌توانید MAX_SYNC_PAYLOAD_MEGS را روی چیزی بیشتر از ۱۰۰ بگذارید تا حد را افزایش دهید. در نظر داشته باشید که اگر از پروکسی معکوس استفاده می‌کنید، شاید لازم باشد حد را آنجا هم تنظیم کنید.

مشارکت در تغییرات

چون این سرور همراه آنکی است، سادگی یک هدف طراحی است — متوجه استفاده فردی/خانوادگی است، و PRهایی که چیزهایی مانند REST API یا پایگاه‌های داده بیرونی اضافه می‌کنند در حال حاضر محتمل نیست پذیرفته شوند. اگر شک دارید، لطفاً پیش از شروع کار روی PR در تماس باشید.

اگر به‌دنبال راه‌حل API موجود هستید، افزونه AnkiConnect ممکن است نیازتان را برآورده کند.