Change:
I upgraded to NixOS 23.11 from 23.05 and I didn't touch seafile configuration files. Now Seahub doesn't start anymore. Steps to reproduce the behavior: to NixOS 23.11 fails Seahub should start normally, the same as NixOS 23.05. <!-- Please @ people who are in the list of the offending package or module. If in doubt, check for whoever last touched something. -- Please run and paste the result. Add a :+1: [reaction] to [issues you find important]. [reaction]: [issues you find important]:
After searching more about this issue, I found , which should solve this once merged.

Discussion:
dataDir = "${seafRoot}/data"; seahubDir = "${seafRoot}/seahub"; <del> in { </del> <ins> in { </ins> ###### Interface

description = "Seafile components"; }; <del> systemd.services = let securityOptions = { ProtectHome = true; PrivateUsers = true; PrivateDevices = true; ProtectClock = true; ProtectHostname = true; ProtectProc = "invisible"; ProtectKernelModules = true; ProtectKernelTunables = true; ProtectKernelLogs = true; ProtectControlGroups = true; RestrictNamespaces = true; LockPersonality = true; RestrictRealtime = true; RestrictSUIDSGID = true; MemoryDenyWriteExecute = true; SystemCallArchitectures = "native"; RestrictAddressFamilies = [ "AF_UNIX" "AF_INET" ]; }; in { seaf-server = { description = "Seafile server"; partOf = [ "seafile.target" ]; after = [ "network.target" ]; wantedBy = [ "seafile.target" ]; restartTriggers = [ ccnetConf seafileConf ]; path = [ pkgs.sqlite ]; serviceConfig = securityOptions // { User = "seafile"; Group = "seafile"; DynamicUser = true; StateDirectory = "seafile"; RuntimeDirectory = "seafile"; LogsDirectory = "seafile"; ConfigurationDirectory = "seafile"; ExecStart = '' ${cfg.seafilePackage}/bin/seaf-server  --foreground  -F /etc/seafile  -c ${ccnetDir}  -d ${dataDir}  -l /var/log/seafile/server.log  -P /run/seafile/server.pid  -p /run/seafile ''; </del> <ins> systemd.services = let securityOptions = { ProtectHome = true; PrivateUsers = true; PrivateDevices = true; ProtectClock = true; ProtectHostname = true; ProtectProc = "invisible"; ProtectKernelModules = true; ProtectKernelTunables = true; ProtectKernelLogs = true; ProtectControlGroups = true; RestrictNamespaces = true; LockPersonality = true; RestrictRealtime = true; RestrictSUIDSGID = true; MemoryDenyWriteExecute = true; SystemCallArchitectures = "native"; RestrictAddressFamilies = [ "AF_UNIX" "AF_INET" ]; </ins> }; <del> preStart = '' if [ ! -f "${seafRoot}/server-setup" ]; then mkdir -p ${dataDir}/library-template mkdir -p ${ccnetDir}/{GroupMgr,misc,OrgMgr,PeerMgr} sqlite3 ${ccnetDir}/GroupMgr/groupmgr.db ".read ${cfg.seafilePackage}/share/seafile/sql/sqlite/groupmgr.sql" sqlite3 ${ccnetDir}/misc/config.db ".read ${cfg.seafilePackage}/share/seafile/sql/sqlite/config.sql" sqlite3 ${ccnetDir}/OrgMgr/orgmgr.db ".read ${cfg.seafilePackage}/share/seafile/sql/sqlite/org.sql" sqlite3 ${ccnetDir}/PeerMgr/usermgr.db ".read ${cfg.seafilePackage}/share/seafile/sql/sqlite/user.sql" sqlite3 ${dataDir}/seafile.db ".read ${cfg.seafilePackage}/share/seafile/sql/sqlite/seafile.sql" echo "${cfg.seafilePackage.version}-sqlite" > "${seafRoot}"/server-setup fi # checking for upgrades and handling them # WARNING: needs to be extended to actually handle major version migrations installedMajor=$(cat "${seafRoot}/server-setup" | cut -d"-" -f1 | cut -d"." -f1) installedMinor=$(cat "${seafRoot}/server-setup" | cut -d"-" -f1 | cut -d"." -f2) pkgMajor=$(echo "${cfg.seafilePackage.version}" | cut -d"." -f1) pkgMinor=$(echo "${cfg.seafilePackage.version}" | cut -d"." -f2) if [[ $installedMajor == $pkgMajor && $installedMinor == $pkgMinor ]]; then : elif [[ $installedMajor == 8 && $installedMinor == 0 && $pkgMajor == 9 && $pkgMinor == 0 ]]; then # Upgrade from 8.0 to 9.0 sqlite3 ${dataDir}/seafile.db ".read ${pkgs.seahub}/scripts/upgrade/sql/9.0.0/sqlite3/seafile.sql" echo "${cfg.seafilePackage.version}-sqlite" > "${seafRoot}"/server-setup else echo "Unsupported upgrade" >&2 exit 1 fi ''; }; </del> <ins> in { seaf-server = { description = "Seafile server"; partOf = [ "seafile.target" ]; after = [ "network.target" ]; wantedBy = [ "seafile.target" ]; restartTriggers = [ ccnetConf seafileConf ]; path = [ pkgs.sqlite ]; serviceConfig = securityOptions // { User = "seafile"; Group = "seafile"; DynamicUser = true; StateDirectory = "seafile"; RuntimeDirectory = "seafile"; LogsDirectory = "seafile"; ConfigurationDirectory = "seafile"; ExecStart = '' ${cfg.seafilePackage}/bin/seaf-server  --foreground  -F /etc/seafile  -c ${ccnetDir}  -d ${dataDir}  -l /var/log/seafile/server.log  -P /run/seafile/server.pid  -p /run/seafile ''; }; preStart = '' if [ ! -f "${seafRoot}/server-setup" ]; then mkdir -p ${dataDir}/library-template mkdir -p ${ccnetDir}/{GroupMgr,misc,OrgMgr,PeerMgr} sqlite3 ${ccnetDir}/GroupMgr/groupmgr.db ".read ${cfg.seafilePackage}/share/seafile/sql/sqlite/groupmgr.sql" sqlite3 ${ccnetDir}/misc/config.db ".read ${cfg.seafilePackage}/share/seafile/sql/sqlite/config.sql" sqlite3 ${ccnetDir}/OrgMgr/orgmgr.db ".read ${cfg.seafilePackage}/share/seafile/sql/sqlite/org.sql" sqlite3 ${ccnetDir}/PeerMgr/usermgr.db ".read ${cfg.seafilePackage}/share/seafile/sql/sqlite/user.sql" sqlite3 ${dataDir}/seafile.db ".read ${cfg.seafilePackage}/share/seafile/sql/sqlite/seafile.sql" echo "${cfg.seafilePackage.version}-sqlite" > "${seafRoot}"/server-setup fi # checking for upgrades and handling them installedMajor=$(cat "${seafRoot}/server-setup" | cut -d"-" -f1 | cut -d"." -f1) installedMinor=$(cat "${seafRoot}/server-setup" | cut -d"-" -f1 | cut -d"." -f2) pkgMajor=$(echo "${cfg.seafilePackage.version}" | cut -d"." -f1) pkgMinor=$(echo "${cfg.seafilePackage.version}" | cut -d"." -f2) </ins> <del> seahub = { description = "Seafile Server Web Frontend"; wantedBy = [ "seafile.target" ]; partOf = [ "seafile.target" ]; after = [ "network.target" "seaf-server.service" ]; requires = [ "seaf-server.service" ]; restartTriggers = [ seahubSettings ]; environment = { PYTHONPATH = "${pkgs.seahub.pythonPath}:${pkgs.seahub}/thirdpart:${pkgs.seahub}"; DJANGO_SETTINGS_MODULE = "seahub.settings"; CCNET_CONF_DIR = ccnetDir; SEAFILE_CONF_DIR = dataDir; SEAFILE_CENTRAL_CONF_DIR = "/etc/seafile"; SEAFILE_RPC_PIPE_PATH = "/run/seafile"; SEAHUB_LOG_DIR = "/var/log/seafile"; </del> <ins> if [[ $installedMajor == $pkgMajor && $installedMinor == $pkgMinor ]]; then : elif [[ $installedMajor == 8 && $installedMinor == 0 && $pkgMajor == 9 && $pkgMinor == 0 ]]; then # Upgrade from 8.0 to 9.0 sqlite3 ${dataDir}/seafile.db ".read ${pkgs.seahub}/scripts/upgrade/sql/9.0.0/sqlite3/seafile.sql" echo "${cfg.seafilePackage.version}-sqlite" > "${seafRoot}"/server-setup elif [[ $installedMajor == 9 && $installedMinor == 0 && $pkgMajor == 10 && $pkgMinor == 0 ]]; then # Upgrade from 9.0 to 10.0 sqlite3 ${dataDir}/seafile.db ".read ${pkgs.seahub}/scripts/upgrade/sql/10.0.0/sqlite3/seafile.sql" echo "${cfg.seafilePackage.version}-sqlite" > "${seafRoot}"/server-setup else echo "Unsupported upgrade" >&2 exit 1 fi ''; </ins> }; <del> serviceConfig = securityOptions // { User = "seafile"; Group = "seafile"; DynamicUser = true; RuntimeDirectory = "seahub"; StateDirectory = "seafile"; LogsDirectory = "seafile"; ConfigurationDirectory = "seafile"; ExecStart = '' ${pkgs.seahub.python.pkgs.gunicorn}/bin/gunicorn seahub.wsgi:application  --name seahub  --workers ${toString cfg.workers}  --log-level=info  --preload  --timeout=1200  --limit-request-line=8190  --bind unix:/run/seahub/gunicorn.sock </del> <ins> seahub = { description = "Seafile Server Web Frontend"; wantedBy = [ "seafile.target" ]; partOf = [ "seafile.target" ]; after = [ "network.target" "seaf-server.service" ]; requires = [ "seaf-server.service" ]; restartTriggers = [ seahubSettings ]; environment = { PYTHONPATH = "${pkgs.seahub.pythonPath}:${pkgs.seahub}/thirdpart:${pkgs.seahub}"; DJANGO_SETTINGS_MODULE = "seahub.settings"; CCNET_CONF_DIR = ccnetDir; SEAFILE_CONF_DIR = dataDir; SEAFILE_CENTRAL_CONF_DIR = "/etc/seafile"; SEAFILE_RPC_PIPE_PATH = "/run/seafile"; SEAHUB_LOG_DIR = "/var/log/seafile"; }; serviceConfig = securityOptions // { User = "seafile"; Group = "seafile"; DynamicUser = true; RuntimeDirectory = "seahub"; StateDirectory = "seafile"; LogsDirectory = "seafile"; ConfigurationDirectory = "seafile"; ExecStart = '' ${pkgs.seahub.python.pkgs.gunicorn}/bin/gunicorn seahub.wsgi:application  --name seahub  --workers ${toString cfg.workers}  --log-level=info  --preload  --timeout=1200  --limit-request-line=8190  --bind unix:/run/seahub/gunicorn.sock ''; }; preStart = '' mkdir -p ${seahubDir}/media # Link all media except avatars for m in `find ${pkgs.seahub}/media/ -maxdepth 1 -not -name "avatars"`; do ln -sf $m ${seahubDir}/media/ done if [ ! -e "${seafRoot}/.seahubSecret" ]; then ${pkgs.seahub.python}/bin/python ${pkgs.seahub}/tools/secret_key_generator.py > ${seafRoot}/.seahubSecret chmod 400 ${seafRoot}/.seahubSecret fi if [ ! -f "${seafRoot}/seahub-setup" ]; then # avatars directory should be writable install -D -t ${seahubDir}/media/avatars/ ${pkgs.seahub}/media/avatars/default.png install -D -t ${seahubDir}/media/avatars/groups ${pkgs.seahub}/media/avatars/groups/default.png # init database ${pkgs.seahub}/manage.py migrate # create admin account ${pkgs.expect}/bin/expect -c 'spawn ${pkgs.seahub}/manage.py createsuperuser --email=${cfg.adminEmail}; expect "Password: "; send "${cfg.initialAdminPassword}r"; expect "Password (again): "; send "${cfg.initialAdminPassword}r"; expect "Superuser created successfully."' echo "${pkgs.seahub.version}-sqlite" > "${seafRoot}/seahub-setup" fi if [ $(cat "${seafRoot}/seahub-setup" | cut -d"-" -f1) != "${pkgs.seahub.version}" ]; then # update database ${pkgs.seahub}/manage.py migrate echo "${pkgs.seahub.version}-sqlite" > "${seafRoot}/seahub-setup" fi </ins> ''; }; <del> preStart = '' mkdir -p ${seahubDir}/media # Link all media except avatars for m in `find ${pkgs.seahub}/media/ -maxdepth 1 -not -name "avatars"`; do ln -sf $m ${seahubDir}/media/ done if [ ! -e "${seafRoot}/.seahubSecret" ]; then ${pkgs.seahub.python}/bin/python ${pkgs.seahub}/tools/secret_key_generator.py > ${seafRoot}/.seahubSecret chmod 400 ${seafRoot}/.seahubSecret fi if [ ! -f "${seafRoot}/seahub-setup" ]; then # avatars directory should be writable install -D -t ${seahubDir}/media/avatars/ ${pkgs.seahub}/media/avatars/default.png install -D -t ${seahubDir}/media/avatars/groups ${pkgs.seahub}/media/avatars/groups/default.png # init database ${pkgs.seahub}/manage.py migrate # create admin account ${pkgs.expect}/bin/expect -c 'spawn ${pkgs.seahub}/manage.py createsuperuser --email=${cfg.adminEmail}; expect "Password: "; send "${cfg.initialAdminPassword}r"; expect "Password (again): "; send "${cfg.initialAdminPassword}r"; expect "Superuser created successfully."' echo "${pkgs.seahub.version}-sqlite" > "${seafRoot}/seahub-setup" fi if [ $(cat "${seafRoot}/seahub-setup" | cut -d"-" -f1) != "${pkgs.seahub.version}" ]; then # update database ${pkgs.seahub}/manage.py migrate echo "${pkgs.seahub.version}-sqlite" > "${seafRoot}/seahub-setup" fi ''; </del> }; <del> }; </del> }; }

, nixosTests }: let <del> # Seahub 8.x.x does not support django-webpack-loader >=1.x.x </del> python = python3.override { packageOverrides = self: super: { <del> django-webpack-loader = super.django-webpack-loader.overridePythonAttrs (old: rec { version = "0.7.0"; src = old.src.override { inherit version; hash = "sha256-ejyIIBqlRIH5OZRlYVy+e5rs6AgUlqbQKHt8uOIy9Ec="; }; }); </del> <ins> django = super.django_3; </ins> }; }; in python.pkgs.buildPythonApplication rec { pname = "seahub"; <del> version = "9.0.10"; </del> <ins> version = "10.0.1"; </ins> pyproject = false; src = fetchFromGitHub { owner = "haiwen"; repo = "seahub"; <del> rev = "5971bf25fe67d94ec4d9f53b785c15a098113620"; # using a fixed revision because upstream may re-tag releases :/ sha256 = "sha256-7Exvm3EShb/1EqwA4wzWB9zCdv0P/ISmjKSoqtOMnqk="; </del> <ins> rev = "e8c02236c0eaca6dde009872745f089da4b77e6e"; # using a fixed revision because upstream may re-tag releases :/ sha256 = "sha256-7JXWKEFqCsC+ZByhvyP8AmDpajT3hpgyYDNUqc3wXyg="; </ins> }; patches = [

<del> { stdenv, lib, fetchFromGitHub, pkg-config, python3, autoreconfHook , libuuid, sqlite, glib, libevent, libsearpc, openssl, fuse, libarchive, which , vala, cmake, oniguruma, nixosTests }: </del> <ins> { stdenv , lib , fetchFromGitHub , pkg-config , python3 , autoreconfHook , libuuid , sqlite , glib , libevent , libsearpc , openssl , fuse , libarchive , libjwt , curl , which , vala , cmake , oniguruma , nixosTests }: </ins> let # seafile-server relies on a specific version of libevhtp.

libevhtp = import ./libevhtp.nix { inherit stdenv lib fetchFromGitHub cmake libevent; }; <del> in stdenv.mkDerivation rec { </del> <ins> in stdenv.mkDerivation rec { </ins> pname = "seafile-server"; <del> version = "9.0.10"; </del> <ins> version = "10.0.1"; </ins> src = fetchFromGitHub { owner = "haiwen"; repo = "seafile-server"; <del> rev = "079a8b65a543bfbc48e7671c3dbbffe19fd02944"; # using a fixed revision because upstream may re-tag releases :/ sha256 = "sha256-F1n4E6ajpri3CVM7B28UKoTV1oOLr5nTy6Lw0E5tCrc="; </del> <ins> rev = "db09baec1b88fc131bf4453a808ab63a3fc714c9"; # using a fixed revision because upstream may re-tag releases :/ sha256 = "sha256-a5vtJcbnaYzq6/3xmhbWk23BZ+Wil/Tb/q22ML4bDqs="; </ins> }; nativeBuildInputs = [ autoreconfHook pkg-config ];

python3 fuse libarchive <ins> libjwt curl </ins> which vala libevhtp