Failed to start seafile server after Migration to PRO

After migrating a Seafile CE installation to PRO (following the guide Migration from Seafile Community - Seafile Admin Manual ) , Seafile inside the seafile container is not starting. The logs show:

*** Running /etc/my_init.d/01_create_data_links.sh...
*** Booting runit daemon...
*** Runit started as PID 14
*** Running /scripts/enterpoint.sh...
2026-06-17 09:39:51 Waiting Nginx 
nginx: [warn] conflicting server name "" on 0.0.0.0:80, ignored
2026-06-17 09:39:51 Nginx ready 
2026-06-17 09:39:51 This is an idle script (infinite loop) to keep container running. 
nginx: [warn] conflicting server name "" on 0.0.0.0:80, ignored
[2026-06-17 09:39:51] Skip running setup-seafile-mysql.py because there is existing seafile-data folder.

Starting seafile server, please wait ...
Failed to start seafile server
Traceback (most recent call last):
  File "/scripts/start.py", line 91, in <module>
    main()
  File "/scripts/start.py", line 76, in main
    call('{} start'.format(get_script('seafile.sh')))
  File "/scripts/utils.py", line 71, in call
    return subprocess.check_call(*a, **kw)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/subprocess.py", line 413, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '/opt/seafile/seafile-pro-server-13.0.12/seafile.sh start' returned non-zero exit status 1.

I’m able to reproduce this error on different machines, following the same migration procedure.

  • Stop Seafile (docker compose down)
  • Change /opt/seafile/.env, additionally use elasticsearch.yml in COMPOSE_FILE, add SEAFILE_ELASTICSEARCH_IMAGE and SEAFILE_ELASTICSEARCH_VOLUME, change SEAFILE_IMAGE to use pro image
  • Change /opt/seafile-data/seafile/conf/seafevents.conf and add [INDEX] section

I manually tried to run seafile.sh start with bash verbose mode and could spot this:

+ LD_LIBRARY_PATH=/opt/seafile/seafile-pro-server-13.0.12/seafile/lib/:/opt/seafile/seafile-pro-server-13.0.12/seafile/lib64:
+ /opt/seafile/seafile-pro-server-13.0.12/seafile/bin/seaf-server -F /opt/seafile/conf -d /opt/seafile/seafile-data -l /opt/seafile/logs/seafile.log -P /opt/seafile/pids/seaf-server.pid -p /opt/seafile/seafile-pro-server-13.0.12/runtime -f -L /opt/seafile
+ [[ false = \t\r\u\e ]]
+ sleep 1
+ /opt/seafile/seafile-pro-server-13.0.12/seafile-monitor.sh
+ pgrep -f seaf-server
+ echo 'Failed to start seafile server'
Failed to start seafile server

I find no errors or hints in the logs. Please advise, thanks :slight_smile:

Wow. I think I found the reason. I did not expect this.

It seems to be caused by the number of users vs. the allowed users in the license file.

I have a license file for 9 users but Seafile detected 10 users in the database. I wouldn’t have guessed a hard cut/failure to start the system. Seen this WARNING in seafile.log:

[2026-06-16 19:47:04] [WARNING] ../common/user-mgr.c(130): The number of users exceeds limit, max 9, current 10
[2026-06-16 19:47:04] [WARNING] seafile-session.c(699): Failed to init user manager.

Once I manually disabled some users, I was able to start the container.

Would be appreciated if this situation would be logged as ERROR, not WARNING and clearly state that Seafile will not start due to a user number mismatch.

Thanks for reporting the issue. We will improve it in the next release.

Thank you for you sharing.

Can you share more how can you do this? Was that ‘drop user’ inside mysql command or anything else?

I went into the seafile-mysql container and verified the users listed in the database ccnet_db in table EmailUser.

root@seafilehost:~# docker exec -it seafile-mysql mysql -u seafile -p -e "SELECT id,email,is_active FROM ccnet_db.EmailUser;"

With a similar UPDATE statement you can now disable specific entries (SET is_active=0 WHERE email = ‘…’;).