[solved] anki windows 2.1.44 cannot sync (windows 10 anki sync server)
cygstar opened this issue · 6 comments
hello, there.
using windows 10 as a anki sync server (python 3.8.5), anki windows v2.1.44, and unchecked legacy timezone handling.
setup and run ankisyncd normally
E:\AnkiSyncd>python -m ankisyncd
[2021-07-14 19:15:15,261]:INFO:ankisyncd:ankisyncd [unknown version] (https://github.com/ankicommunity/anki-sync-server.git)
[2021-07-14 19:15:15,352]:INFO:ankisyncd:Loaded config from E:\AnkiSyncd\ankisyncd.conf
[2021-07-14 19:15:15,352]:INFO:ankisyncd.users:Found auth_db_path in config, using SqliteUserManager for auth
[2021-07-14 19:15:15,353]:INFO:ankisyncd.sessions:Found session_db_path in config, using SqliteSessionManager for auth
[2021-07-14 19:15:15,357]:INFO:ankisyncd:Serving HTTP on 192.168.1.138 port 27701...
but cannot sync at windows desktop
selected [upload] then went wrong, at the same time, synced anything to server
E:\AnkiSyncd>python -m ankisyncd
[2021-07-14 17:58:13,821]:INFO:ankisyncd:ankisyncd [unknown version] (https://github.com/ankicommunity/anki-sync-server.git)
[2021-07-14 17:58:13,911]:INFO:ankisyncd:Loaded config from E:\AnkiSyncd\ankisyncd.conf
[2021-07-14 17:58:13,912]:INFO:ankisyncd.users:Found auth_db_path in config, using SqliteUserManager for auth
[2021-07-14 17:58:13,913]:INFO:ankisyncd.sessions:Found session_db_path in config, using SqliteSessionManager for auth
[2021-07-14 17:58:13,916]:INFO:ankisyncd:Serving HTTP on 192.168.1.138 port 27701...
[2021-07-14 17:58:52,128]:INFO:ankisyncd.users:Authentication succeeded for user voa@anki.com
[2021-07-14 17:58:52,285]:INFO:ankisyncd.http:192.168.1.138 "POST /sync/hostKey HTTP/1.1" 200 43
[2021-07-14 17:58:52,461]:INFO:ankisyncd.CollectionThread[voa@anki.com]:Starting...
[2021-07-14 17:58:52,461]:INFO:ankisyncd.CollectionThread[voa@anki.com]:Running meta(*[], **{'v': 10, 'cv': 'anki,2.1.44 (b2b3275f),win:10'})
[2021-07-14 17:58:53,028]:INFO:ankisyncd.http:192.168.1.138 "POST /sync/meta HTTP/1.1" 200 135
[2021-07-14 17:58:53,030]:INFO:ankisyncd.CollectionThread[voa@anki.com]:Running begin(*[], **{'skey': '2e8d0158'})
[2021-07-14 17:58:53,031]:INFO:ankisyncd.http:192.168.1.138 "GET /msync/begin?k=208a60cab926e3a39073d873b7311662&v=anki%2C2.1.44+%28b2b3275f%29%2Cwin%3A10 HTTP/1.1" 200 49
[2021-07-14 17:58:53,047]:INFO:ankisyncd.CollectionThread[voa@anki.com]:Running uploadChanges(*[], **{'data': b'PK\x03\x04\x14\x00\x00\x00\x00\x00Z\x8f\xeeR\x19\xd5\x129\xeas\x00\x00\xeas\x00\x00\x01\x00\x00\x000\xff\xfbP\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Info\x00\x00\x00\x0f\x00\x00\x00\x8d\x00\x00s\xea\x00\x03\x05\t\n\x0e\x10\x12\x15\x17\x1b\x1d...'})
[2021-07-14 17:58:53,219]:INFO:ankisyncd.http:192.168.1.138 "POST /msync/uploadChanges HTTP/1.1" 200 29
[2021-07-14 17:58:53,238]:INFO:ankisyncd.CollectionThread[voa@anki.com]:Running uploadChanges(*[], **{'data': b'PK\x03\x04\x14\x00\x00\x00\x00\x00Z\x8f\xeeRtg{>H\xea\x00\x00H\xea\x00\x00\x01\x00\x00\x000\xff\xfbP\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Info\x00\x00\x00\x0f\x00\x00\x01\x1e\x00\x00\xeaH\x00\x02\x05\x08\n\r\x10\x12\x14\x17\x19\x1c...'})
[2021-07-14 17:58:53,394]:INFO:ankisyncd.http:192.168.1.138 "POST /msync/uploadChanges HTTP/1.1" 200 29
[2021-07-14 17:58:53,405]:INFO:ankisyncd.CollectionThread[voa@anki.com]:Running uploadChanges(*[], **{'data': b'PK\x03\x04\x14\x00\x00\x00\x00\x00Z\x8f\xeeR\x1a-&\x1d\xf9\x80\x00\x00\xf9\x80\x00\x00\x01\x00\x00\x000\xff\xfbP\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Info\x00\x00\x00\x0f\x00\x00\x00\x9d\x00\x00\x80\xf9\x00\x03\x06\x08\x0b\r\x10\x11\x15\x18\x1a\x1d...'})
[2021-07-14 17:58:53,551]:INFO:ankisyncd.http:192.168.1.138 "POST /msync/uploadChanges HTTP/1.1" 200 28
[2021-07-14 17:58:53,556]:INFO:ankisyncd.CollectionThread[voa@anki.com]:Running mediaSanity(*[], **{'local': 55})
[2021-07-14 17:58:53,556]:INFO:ankisyncd.http:192.168.1.138 "POST /msync/mediaSanity HTTP/1.1" 200 25
[2021-07-14 17:59:23,588]:INFO:ankisyncd.http:192.168.1.138 "POST /sync/upload HTTP/1.1" 403 157
if selected [download], lost anything, selected [update], problems are the same
if selected [later], [legacy timezone handling] disappeared, also ankisyncd showed some messages
E:\AnkiSyncd>python -m ankisyncd
[2021-07-14 18:37:27,774]:INFO:ankisyncd:ankisyncd [unknown version] (https://github.com/ankicommunity/anki-sync-server.git)
[2021-07-14 18:37:27,864]:INFO:ankisyncd:Loaded config from E:\AnkiSyncd\ankisyncd.conf
[2021-07-14 18:37:27,865]:INFO:ankisyncd.users:Found auth_db_path in config, using SqliteUserManager for auth
[2021-07-14 18:37:27,866]:INFO:ankisyncd.sessions:Found session_db_path in config, using SqliteSessionManager for auth
[2021-07-14 18:37:27,870]:INFO:ankisyncd:Serving HTTP on 192.168.1.138 port 27701...
[2021-07-14 18:54:05,497]:INFO:ankisyncd.CollectionThread[voa@anki.com]:Starting...
[2021-07-14 18:54:05,497]:INFO:ankisyncd.CollectionThread[voa@anki.com]:Running begin(*[], **{'skey': 'f2a3a12c'})
[2021-07-14 18:54:05,504]:INFO:ankisyncd.http:192.168.1.138 "GET /msync/begin?k=9c536267dd7b461a8757547ff465a435&v=anki%2C2.1.44+%28b2b3275f%29%2Cwin%3A10 HTTP/1.1" 200 50
[2021-07-14 18:54:05,895]:INFO:ankisyncd.CollectionThread[voa@anki.com]:Running meta(*[], **{'v': 10, 'cv': 'anki,2.1.44 (b2b3275f),win:10'})
[2021-07-14 18:54:05,900]:INFO:ankisyncd.http:192.168.1.138 "POST /sync/meta HTTP/1.1" 200 136
[2021-07-14 18:54:05,910]:INFO:ankisyncd.CollectionThread[voa@anki.com]:Running start(*[], **{'minUsn': 0, 'lnewer': True, 'graves': None})
[2021-07-14 18:54:05,911]:ERROR:ankisyncd.CollectionThread[voa@anki.com]:Unable to start(*[], **{'minUsn': 0, 'lnewer': True, 'graves': None}): 'NoneType' object is not subscriptable
Traceback (most recent call last):
File "E:\AnkiSyncd\ankisyncd\thread.py", line 98, in _run
ret = self.wrapper.execute(func, args, kw, return_queue)
File "E:\AnkiSyncd\ankisyncd\collection.py", line 45, in execute
ret = func(*args, **kw)
File "E:\AnkiSyncd\ankisyncd\sync_app.py", line 579, in run_func
res = handler_method(**keyword_args)
File "E:\AnkiSyncd\ankisyncd\sync_app.py", line 124, in start
self.remove(graves)
File "E:\AnkiSyncd\ankisyncd\sync.py", line 221, in remove
self.col.remove_cards_and_orphaned_notes(graves['cards'])
TypeError: 'NoneType' object is not subscriptable
Traceback (most recent call last):
File "C:\Program Files\Python38\lib\wsgiref\handlers.py", line 137, in run
self.result = application(self.environ, self.start_response)
File "C:\Program Files\Python38\lib\site-packages\webob\dec.py", line 129, in __call__
resp = self.call_func(req, *args, **kw)
File "C:\Program Files\Python38\lib\site-packages\webob\dec.py", line 193, in call_func
return self.func(req, *args, **kwargs)
File "E:\AnkiSyncd\ankisyncd\sync_app.py", line 523, in __call__
result = self._execute_handler_method_in_thread(url, data, session)
File "E:\AnkiSyncd\ankisyncd\sync_app.py", line 588, in _execute_handler_method_in_thread
result = thread.execute(run_func, kw=keyword_args)
File "E:\AnkiSyncd\ankisyncd\thread.py", line 79, in execute
raise ret
File "E:\AnkiSyncd\ankisyncd\thread.py", line 98, in _run
ret = self.wrapper.execute(func, args, kw, return_queue)
File "E:\AnkiSyncd\ankisyncd\collection.py", line 45, in execute
ret = func(*args, **kw)
File "E:\AnkiSyncd\ankisyncd\sync_app.py", line 579, in run_func
res = handler_method(**keyword_args)
File "E:\AnkiSyncd\ankisyncd\sync_app.py", line 124, in start
self.remove(graves)
File "E:\AnkiSyncd\ankisyncd\sync.py", line 221, in remove
self.col.remove_cards_and_orphaned_notes(graves['cards'])
TypeError: 'NoneType' object is not subscriptable
[2021-07-14 18:54:05,929]:INFO:ankisyncd.http:192.168.1.138 "POST /sync/start HTTP/1.1" 500 59
[2021-07-14 18:54:05,932]:INFO:ankisyncd.http:192.168.1.138 "POST /sync/abort HTTP/1.1" 404 154
[2021-07-14 18:55:43,390]:INFO:ankisyncd.ThreadingCollectionManager:Monitor is closing collection on inactive CollectionThread[voa@anki.com]
[2021-07-14 18:55:43,391]:INFO:ankisyncd.CollectionThread[voa@anki.com]:Running _close(*[], **{})
those are all info,
best regards.
Have you configured nginx?
oops, jumped over this step, will try it again.
thank you so much for the help, sir.
many thanks again.
have set up nginx windows 1.20.1, and start the service as normal.
nginx.conf
## anki_sync_server;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 27701;
server_name 192.168.1.138;
location / {
proxy_http_version 1.0;
proxy_pass http://192.168.1.138:27702;
}
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
E:\AnkiSyncd>tasklist /fi "imagename eq nginx.exe"
Image Name PID Session Name Session# Mem Usage
========================= ======== ================ =========== ============
nginx.exe 7088 Console 1 7,632 K
nginx.exe 8264 Console 1 8,212 K
fixed #83 at sync_app.py, started the sync server
E:\AnkiSyncd>python -m ankisyncd
[2021-07-16 18:08:50,585]:INFO:ankisyncd:ankisyncd [unknown version] (https://github.com/ankicommunity/anki-sync-server.git)
[2021-07-16 18:08:50,679]:INFO:ankisyncd:Loaded config from E:\AnkiSyncd\ankisyncd.conf
[2021-07-16 18:08:50,679]:INFO:ankisyncd.users:Found auth_db_path in config, using SqliteUserManager for auth
[2021-07-16 18:08:50,679]:INFO:ankisyncd.sessions:Found session_db_path in config, using SqliteSessionManager for auth
[2021-07-16 18:08:50,679]:INFO:ankisyncd:Serving HTTP on 192.168.1.138 port 27702...
if using module anki 2.1.40, works abnormally
then, upgraded to anki 2.1.44
great, it can sync now, but still has one major issue.
cannot sync media files
even cannot create a media folder [collection.media] at server
(instead of no nginx, it can sync anything to the server)
Fri Jul 16 18:09:27 2021: Media sync starting...
Fri Jul 16 18:09:27 2021: A network error occurred.
Error details: HTTP status client error (413 Payload Too Large) for url ()
ankisyncd.conf
[sync_app]
# change to 127.0.0.1 if you don't want the server to be accessible from the internet
host = 192.168.1.138
port = 27702
data_root = ./collections
base_url = /sync/
base_media_url = /msync/
auth_db_path = ./auth.db
# optional, for session persistence between restarts
session_db_path = ./session.db
ankiSyncd.py
import os
addr = 'http://192.168.1.138:27701/' ## put your server address here
os.environ['SYNC_ENDPOINT'] = addr + 'sync/'
os.environ['SYNC_ENDPOINT_MEDIA'] = addr + 'msync/'
also tried nginx 1.21.1, the problem is still the same.
finally, it can sync on anki v2.1.44 windows desktop. good news.
real appreciate that you guys all hard work. thank you.
now can sync all media files, without any issues.
put following line
client_max_body_size 0;
into http {} in nginx.conf to disable the body size check
then reload nginx and restart sync server
many thanks to dobefore and VikashKothary
best regards!
installing anki sync server for windows 10, and sync at anki 2.1.44 windows version
- download and install python 3.8.x windows edition
- download anki-sync-server, unzip .\src into a local disk folder [for example: E:\AnkiSyncd]
- open cmd as administrator at local disk folder
E:\AnkiSyncd>
- Install the dependencies
pip install -r requirements.txt
- upgrade anki module to 2.1.44
pip install anki==2.1.44 -U
- modify ankisyncd.conf
(must change the host ip address xxx.xxx.xxx.xxx to suit yours, for example your server/pc ip adress: 192.168.1.138)
[sync_app]
# change to 127.0.0.1 if you don't want the server to be accessible from the internet
host = xxx.xxx.xxx.xxx
port = 27702
data_root = ./collections
base_url = /sync/
base_media_url = /msync/
auth_db_path = ./auth.db
# optional, for session persistence between restarts
session_db_path = ./session.db
- create user and password
(fully support for ankidroid, if using like email address, for example of username: xxxx@xxxxx.xxx)
python ankisyncctl.py adduser <username>
- download nginx-1.21.1, unzip all to local disk folder and setup nginx
modify nginx.conf at .\conf and change proxy_pass ip address xxx.xxx.xxx.xxx to suit yours.
## anki_sync_server;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
# set client body size to 0, disable the body size check
client_max_body_size 0;
sendfile on;
keepalive_timeout 65;
server {
listen 27701;
server_name 192.168.1.138;
location / {
proxy_http_version 1.0;
proxy_pass http://xxx.xxx.xxx.xxx:27702;
}
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
- start nginx service
start nginx
or reload nginx if nginx.conf has changed
nginx -s reload
check nginx service if started
tasklist /fi "imagename eq nginx.exe"
nginx is started, if showing those messages
Image Name PID Session Name Session# Mem Usage
========================= ======== ================ =========== ============
nginx.exe 11416 Console 1 7,688 K
nginx.exe 8612 Console 1 8,040 K
python -m ankisyncd
- create an anki 2.1 type addon at anki addon folder .\addons21
(must change addr xxx.xxx.xxx.xxx to your anki sync server ip address)
Create a new directory in the add-ons folder (name it something like ankisyncd), create a file named
__init__.py
containing the code below and put it in the ankisyncd directory.
python file must save as code page utf-8
# -*- coding: utf-8 -*-
#----------------------------------------------------------------------
import os
addr = 'http://xxx.xxx.xxx.xxx:27701/' ## put your server address here
os.environ['SYNC_ENDPOINT'] = addr + 'sync/'
os.environ['SYNC_ENDPOINT_MEDIA'] = addr + 'msync/'
- run and setup sync user/password at anki 2.1.44 windows, then anything will be syncd
- setup ankidroid 2.15.6
settings --> advanced --> custom sync server
check [custom sync server]
sync url: (xxx.xxx.xxx.xxx must be your anki sync server ip address)
http://xxx.xxx.xxx.xxx:27701/
media sync url:
http://xxx.xxx.xxx.xxx:27701/msync/
settings --> ankidroid --> ankiweb account
enter username and password, and log in
15. quit nginx
nginx -s quit
Thanks for documenting the solution for your problem.
If you think it'll help others, do you think you'll be able to raise a PR to include in our documentation?