Seafile community edition 11.0 and SeaDoc 0.2 is ready for testing!

We are excited to announce that Seafile community edition 11.0 and SeaDoc 0.2 is ready for testing! :tada:

We will release a stable version of Seafile in November with a beta version of SeaDoc.

Recap of major changes in Seafile v11

  • Change of user identity
  • Reimplementation of LDAP Integration
  • File Activities Now Enabled in Community Edition
  • SQLite Database Support is dropped
  • Enhancing the Seafile User Interface
  • A New Collaborative Online Editor - SeaDoc (alpha)

SeaDoc enables seamless co-editing and workflow management for documents. Key features include:

  • An expressive collaborative editor
  • Content workflows, file lock, change review and publish to control document evolution
  • Inter-document linking - Connect related documents together

Some screenshots for UI improvements

  1. The notifications now open in a dialog instead of a separate page

  2. Menu items are now grouped and less used items are moved to secondary menu

  3. File tags UI are redesigned, make it clean and easy to use

  4. File search now have a keyboard shortcut and a larger dialog, you can also scroll down to load more items

4 Likes

Hi, first of thank you for the new release.

There is an issue with seafdav server not starting:

2023-10-18 21:09:51 seafile-controller.c(411): pid file /opt/seafile/pids/seafdav.pid does not exist
2023-10-18 21:09:51 seafile-controller.c(490): seafdav need restart...
2023-10-18 21:09:51 seafile-controller.c(82): spawn_process: /usr/bin/python3 -m wsgidav.server.server_cli --server gunicorn --root / --log-file /opt/seafile/logs/seafdav.log --pid /opt/seafile/pids/seafdav.pid --port 8080 --host 0.0.0.0
2023-10-18 21:09:51 seafile-controller.c(116): spawned /usr/bin/python3, pid 2492
2023-10-18 21:09:51 seafile-controller.c(124): Traceback (most recent call last):
  File "/usr/lib/python3.10/runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib/python3.10/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/opt/seafile/seafile-server-11.0.1/seahub/thirdpart/wsgidav/server/server_cli.py", line 53, in <module>
    from wsgidav.seafile_dav_provider import SeafileProvider
  File "/opt/seafile/seafile-server-11.0.1/seahub/thirdpart/wsgidav/seafile_dav_provider.py", line 2
    from wsgidav.dav_error import DAVError, HTTP_BAD_REQUEST, HTTP_FORBIDDEN, \
    ^^^^
SyntaxError: invalid syntax

The first two lines of the file seafile_dav_provider.py look like this:

from wsgidav.dav_error import DAVError, HTTP_BAD_REQUEST, HTTP_FORBIDDEN, \
from wsgidav.dav_error import DAVError, HTTP_BAD_REQUEST, HTTP_FORBIDDEN, \
    HTTP_NOT_FOUND, HTTP_INTERNAL_ERROR, HTTP_TOO_MANY_FILES_IN_LIBRARY

The syntax error was resolved after deleting the first line and seafdav started normally.

Thanks for reporting the issue. This is a packaging problem. We have rebuilt and reuploaded the package and docker image.

i don’t use docker on my seafile server. is docker the only option to install seadoc?

You can install SeaDoc with docker while Seafile with the native binary package.

For SeaDoc, we will only provide docker image. So that we can focus on the feature development, and spend less time in compatibility issues.

I am thinking of upgrading in stages. Is SeaDoc elective? Can Seafile CE 11 be run without it, at least for a time?

SeaDoc is an add-on feature. You can run Seafile CE 11 without SeaDoc.

Thank you for this great job. We’re going to install it.

What is that docker compose string for the latest 11 version? If i run “latest” it doesnt pull anything new. I am on 10.0.1 at the moment/

Sorry. I input 11.0.1 ant it worked, dunno why it didnt work first time.

I have another issue with LDAP config. It is said in manual that i need to move seetings to seahub_settings.py. I did but it didnt work. Here is my section from ccnet.conf and new one from seahub_settings:

ccnet.conf:

[LDAP]

HOST = ldap://corp.dc.com
BASE = ou=User,dc=corp,dc=dc,dc=com
USER_DN = CN=ldapsearch,OU=User,DC=corp,DC=dc,DC=com
PASSWORD = password
LOGIN_ATTR = userPrincipalName
FILTER = memberOf=cn=seafile_users,ou=GROUP,dc=corp,dc=dc,dc=com

Seahub_settings.py:

# Basic configuration items, LDAP login, and LDAP sync tasks use these configurations together.

ENABLE_LDAP = True

LDAP_SERVER_URL = 'ldap://corp.dc.com'     # The URL of LDAP server

LDAP_BASE_DN = 'ou=User,dc=corp,dc=dc,dc=com'   # The root node of users who can

                                             # log in to Seafile in the LDAP server

LDAP_ADMIN_DN = 'CN=ldapsearch,OU=User,DC=corp,DC=dc,DC=com'  # DN of the administrator used

                                             # to query the LDAP server for information

LDAP_ADMIN_PASSWORD = 'password'            # Password of LDAP_ADMIN_DN

LDAP_PROVIDER = 'ldap'                       # Identify the source of the user, used in

                                             # the table social_auth_usersocialauth, defaults to 'ldap'

LDAP_LOGIN_ATTR = 'userPrincipalName'        # User's attribute used to log in to Seafile,

                                             # can be mail or userPrincipalName, cannot be changed

LDAP_FILTER = 'memberOf=cn=seafile_users,ou=GROUP,dc=corp,dc=dc,dc=com'  # Additional filter conditions,

                                             # users who meet the filter conditions can log in, otherwise they cannot log in

# Common user sync configuration item

LDAP_USER_FIRST_NAME_ATTR = 'givenName'  # For sync user's first name

LDAP_USER_LAST_NAME_ATTR = 'sn'          # For sync user's last name

LDAP_USER_NAME_REVERSE = False           # Whether to reverse the user's first and last name

IMPORT_NEW_USER = True                   # Whether to import new users when sync user

ACTIVATE_USER_WHEN_IMPORT = False        # Whether to activate the user when importing new user

ENABLE_EXTRA_USER_INFO_SYNC = True       # Whether to enable sync of additional user information,

                                         # including user's full name, department, and Windows login name, etc.

# LDAP sync task period, in minutes

LDAP_SYNC_INTERVAL = 60

# LDAP sync user configuration items.

ENABLE_LDAP_USER_SYNC = True             # Whether to enable user sync

LDAP_USER_OBJECT_CLASS = 'person'        # This is the name of the class used to search for user objects.

                                         # In Active Directory, it's usually "person". The default value is "person".

LDAP_DEPT_ATTR = ''                      # LDAP user's department info

LDAP_UID_ATTR = ''                       # LDAP user's login_id attribute

LDAP_CONTACT_EMAIL_ATTR = ''             # LDAP user's contact_email attribute

LDAP_USER_ROLE_ATTR = ''                 # LDAP user's role attribute

LDAP_AUTO_REACTIVATE_USERS = True        # Whether to auto activate deactivated user

LDAP_USE_PAGED_RESULT = False            # Whether to use pagination extension

# Common user sync configuration items

DEACTIVE_USER_IF_NOTFOUND = False        # Set to "true" if you want to deactivate a user

                                         # when he/she was deleted in AD server.

# LDAP group sync configuration items.

ENABLE_LDAP_GROUP_SYNC = True            # Whether to enable group sync

LDAP_GROUP_FILTER = ''                   # Group sync filter

LDAP_SYNC_DEPARTMENT_FROM_OU = True      # Whether to enable sync departments from OU.

LDAP_GROUP_OBJECT_CLASS = 'group'        # This is the name of the class used to search for group objects.

LDAP_GROUP_MEMBER_ATTR = 'member'        # The attribute field to use when loading the group's members.

                                         # For most directory servers, the attributes is "member"

                                         # which is the default value.For "posixGroup", it should be set to "memberUid".

LDAP_USER_ATTR_IN_MEMBERUID = 'uid'      # The user attribute set in 'memberUid' option,

                                         # which is used in "posixGroup".The default value is "uid".

LDAP_GROUP_UUID_ATTR = 'objectGUID'      # Used to uniquely identify groups in LDAP

LDAP_USE_GROUP_MEMBER_RANGE_QUERY = False   # When a group contains too many members,

                                         # AD will only return part of them. Set this option to TRUE

                                         # to make LDAP sync work with large groups.

LDAP_SYNC_GROUP_AS_DEPARTMENT = False    # Whether to sync groups as top-level departments in Seafile

LDAP_DEPT_NAME_ATTR = ''                 # Used to get the department name.

LDAP_CREATE_DEPARTMENT_LIBRARY = False   # If you decide to sync the group as a department,

                                         # you can set this option to "true". In this way, when

                                         # the group is synchronized for the first time, a library

                                         # is automatically created for the department, and the

                                         # library's name is the department's name.

LDAP_DEPT_REPO_PERM = 'rw'               # Set the permissions of the department repo, default permission is 'rw'.

LDAP_DEFAULT_DEPARTMENT_QUOTA = -2       # You can set a default space quota for each department

                                         # when you synchronize a group for the first time. The

                                         # quota is set to unlimited if this option is not set.

                                         # Unit is MB.

DEL_GROUP_IF_NOT_FOUND = False           # Set to "true", sync process will delete the group if not found it in LDAP server.

DEL_DEPARTMENT_IF_NOT_FOUND = False      # Set to "true", sync process will deleted the department if not found it in LDAP server.

Can you try to only keep the following settings and remove all others:

# Basic configuration items

ENABLE_LDAP = True
LDAP_SERVER_URL = 'ldap://corp.dc.com'     # The URL of LDAP server
LDAP_BASE_DN = 'ou=User,dc=corp,dc=dc,dc=com'   # The root node of users who can

                                             # log in to Seafile in the LDAP server
LDAP_ADMIN_DN = 'CN=ldapsearch,OU=User,DC=corp,DC=dc,DC=com'  # DN of the administrator used

                                             # to query the LDAP server for information
LDAP_ADMIN_PASSWORD = 'password'            # Password of LDAP_ADMIN_DN
LDAP_PROVIDER = 'ldap'                       # Identify the source of the user, used in

                                             # the table social_auth_usersocialauth, defaults to 'ldap'
LDAP_LOGIN_ATTR = 'userPrincipalName'        # User's attribute used to log in to Seafile,

                                             # can be mail or userPrincipalName, cannot be changed

LDAP_FILTER = 'memberOf=cn=seafile_users,ou=GROUP,dc=corp,dc=dc,dc=com'  # Additional filter conditions,

                                             # users who meet the filter conditions can log in, otherwise they cannot log in

# Update user information when the user login

LDAP_USER_FIRST_NAME_ATTR = 'givenName'  # For update user's first name
LDAP_USER_LAST_NAME_ATTR = 'sn'          # For update user's last name
LDAP_USER_NAME_REVERSE = False           # Whether to reverse the user's first and last name

As other options are pro only and misleading. We have updated the document in the meanwhile.

Is there also a pro edition of it?

Pro edition will be available in November.

Thank you. It worked. But i also had to get inside a docker container and run
python3 migrate_ldapusers.py

Hello,
I’ve been testing Seafile 11.0.1 and LDAP is somewhat working but still has some problems. I’m currently using a fresh docker install. The webui login works without problems, I can use my email as the username and my password as my password. The thing is, that I can’t login via the seafile client. It throws me the error “Failed to login: Incorrect email or password”. The only thing with debugging enabled in the logs is
“2023-10-31 22:32:34,288 [WARNING] django.request:241 log_response Bad Request: /api2/auth-token/”

Can you help me out?

# -*- coding: utf-8 -*-
SECRET_KEY = "b'$somethingsecrethere'"
SERVICE_URL = "https://seafile.mydomain.com/"
CSRF_TRUSTED_ORIGINS = ['https://seafile.mydomain.com']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'seahub_db',
        'USER': 'seafile',
        'PASSWORD': 'aproperpassword',
        'HOST': 'db',
        'PORT': '3306',
        'OPTIONS': {'charset': 'utf8mb4'},
    }
}


CACHES = {
    'default': {
        'BACKEND': 'django_pylibmc.memcached.PyLibMCCache',
        'LOCATION': 'memcached:11211',
    },
    'locmem': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    },
}
COMPRESS_CACHE_BACKEND = 'locmem'
TIME_ZONE = 'Europe/Berlin'
DEBUG = True
FILE_SERVER_ROOT = "https://seafile.mydomain.com/seafhttp"
ENABLE_LDAP = True
LDAP_SERVER_URL = 'ldaps://ldap.mydomain.com:636'     # The URL of LDAP server
LDAP_BASE_DN = 'ou=people,dc=mydomain,dc=de'   # The root node of users who can
                                             # log in to Seafile in the LDAP server
LDAP_ADMIN_DN = 'cn=admin,dc=mydomain,dc=de'  # DN of the administrator used
                                             # to query the LDAP server for information.
                                             # For OpenLDAP, it maybe cn=admin,dc=example,dc=com
LDAP_ADMIN_PASSWORD = 'passwordhere'            # Password of LDAP_ADMIN_DN
LDAP_PROVIDER = 'ldap'                       # Identify the source of the user, used in
                                             # the table social_auth_usersocialauth, defaults to 'ldap'
LDAP_LOGIN_ATTR = 'mail'        # User's attribute used to log in to Seafile,
                                             # can be mail or userPrincipalName, cannot be changed
LDAP_CONTACT_EMAIL_ATTR = 'mail'                 # LDAP user's contact_email attribute
LDAP_USER_ROLE_ATTR = ''                     # LDAP user's role attribute
LDAP_USER_FIRST_NAME_ATTR = 'givenName'      # For sync user's first name
LDAP_USER_LAST_NAME_ATTR = 'sn'              # For sync user's last name
LDAP_USER_NAME_REVERSE = False               # Whether to reverse the user's first and last name

My docker-compose.yml if that helps:

services:
  db:
    image: mariadb:11.1.2-jammy
    container_name: seafile-mysql
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=mysupersecretpassword
      - MYSQL_LOG_CONSOLE=true
      - MARIADB_AUTO_UPGRADE=yes
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - /opt/containers/seafile/db:/var/lib/mysql
    networks:
      - default

  memcached:
    image: memcached:1.6.21-alpine
    container_name: seafile-memcached
    entrypoint: memcached -m 256
    networks:
      - default

  seafile:
    image: seafileltd/seafile-mc:11.0.1
    container_name: seafile
    volumes:
      - /opt/containers/seafile/data:/shared   # Requested, specifies the path to Seafile data persistent store.
    environment:
      - DB_HOST=db
      - DB_ROOT_PASSWD=mysupersecretpassword # Requested, the value shuold be root's password of MySQL service.
      - TIME_ZONE=Europe/Berlin  # Optional, default is UTC. Should be uncomment and set to your local time zone.
      - SEAFILE_ADMIN_EMAIL=webmaster@mydomain.com # Specifies Seafile admin user, default is 'me@example.com'.
      - SEAFILE_ADMIN_PASSWORD=asupersecretadminpasswd     # Specifies Seafile admin password, default is 'asecret'.
      - SEAFILE_SERVER_LETSENCRYPT=false   # Whether to use https or not.
      - SEAFILE_SERVER_HOSTNAME=seafile.mydomain.com # Specifies your host name if https is enabled.
      - FORCE_HTTPS_IN_CONF=true
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.seafile-app.entrypoints=https"
      - "traefik.http.routers.seafile-app.rule=Host(`seafile.mydomain.com`)"
      - "traefik.http.routers.seafile-app.tls=true"
      - "traefik.http.routers.seafile-app.tls.certresolver=http"
      - "traefik.http.routers.seafile-app.service=seafile-app"
      - "traefik.http.services.seafile-app.loadbalancer.server.port=80"
      - "traefik.docker.network=proxy"
    depends_on:
      - db
      - memcached
    networks:
      - default
      - proxy

networks:
  proxy:
    external: true

Can you login in the client with a local account? For example, the admin account you created with email and password.

Yes, that’s working as expected

Hello Daniel,
I am reaching out to inquire about the stability and suitability for production use of Seafile Community Edition 11.0 and Seafile SeaDoc 0.2.

As we are considering these versions for deployment, could you provide information on their current stability status and whether they are recommended for use in production environments? Any insights or recommendations you can offer would be greatly appreciated.

Thank you for your time and assistance.

But still having the same issue. Do you have any advise for me to troubleshoot? Any information I should/could provide you with?

Seafile Community edition v11 is still in beta and SeaDoc 0.2 is in alpha status. So I don’t recommend you use them in production environment.

Seafile Community edition 11.0.2 (stable) and SeaDoc 0.3 (beta) will be released within a few weeks.