seafile | *** Running /etc/my_init.d/01_create_data_links.sh…
seafile | *** Booting runit daemon…
seafile | *** Runit started as PID 11
seafile | *** Running /scripts/enterpoint.sh…
seafile | 2026-04-13 02:17:29 Waiting Nginx
seafile | nginx: [warn] conflicting server name “” on 0.0.0.0:80, ignored
seafile | 2026-04-13 02:17:29 Nginx ready
seafile | 2026-04-13 02:17:29 Create linux user seafile in container, please wait.
seafile | 2026-04-13 02:17:29 The permission of path seafile/ is incorrect.
seafile | 2026-04-13 02:17:29 To use non root, change the folder permission of seafile folder in your host machine by ‘chmod -R a+rwx /opt/seafile-data/’ and try again later. (If you use another path, change the path in the command correspondingly). Now quit.
seafile | *** /scripts/enterpoint.sh exited with status 1.
seafile | *** Shutting down runit daemon (PID 11)…
seafile | *** Running /etc/my_init.post_shutdown.d/10_syslog-ng.shutdown…
seafile | *** Killing all processes…
seafile exited with code 1 (restarting)
seafile | *** Running /etc/my_init.d/01_create_data_links.sh…
seafile | *** Booting runit daemon…
seafile | *** Runit started as PID 11
seafile | *** Running /scripts/enterpoint.sh…
seafile | nginx: [warn] conflicting server name “” on 0.0.0.0:80, ignored
seafile | 2026-04-13 02:17:31 Nginx ready
seafile | 2026-04-13 02:17:31 Create linux user seafile in container, please wait.
seafile | groupadd: group ‘seafile’ already exists
seafile | useradd: user ‘seafile’ already exists
seafile | 2026-04-13 02:17:31 The permission of path seafile/ is incorrect.
seafile | 2026-04-13 02:17:31 To use non root, change the folder permission of seafile folder in your host machine by ‘chmod -R a+rwx /opt/seafile-data/’ and try again later. (If you use another path, change the path in the command correspondingly). Now quit.
seafile | *** /scripts/enterpoint.sh exited with status 1.
seafile | *** Shutting down runit daemon (PID 11)…
seafile | *** Running /etc/my_init.post_shutdown.d/10_syslog-ng.shutdown…
seafile | *** Killing all processes…
seafile exited with code 1 (restarting)
seafile | *** Running /etc/my_init.d/01_create_data_links.sh…
seafile | *** Booting runit daemon…
seafile | *** Runit started as PID 11
seafile | *** Running /scripts/enterpoint.sh…
Here are suggestions from Our AI (manually checked) :
The error logs indicate that the container is failing because it cannot access the data directory with the necessary permissions required for non-root mode. When NON_ROOT=true is set, the Seafile container creates and runs as a specific user (UID 8000), and it currently lacks write access to your external volume.
According to the Seafile Admin Manual , you should follow these steps to resolve the issue:
1. Fix Permissions on the Host
The most direct fix is to grant the necessary permissions to the folder on your macOS host. Open your terminal and run:
If this is a new installation, the initialization process often requires root privileges to set up the internal folder structure correctly before switching to a non-root user.
In your docker-compose.yml, set NON_ROOT=false.
Run docker compose up -d and wait for the system to initialize completely.
Stop and remove the containers: docker compose down.
Apply the chmod command mentioned in Step 1 to your host directory.
Change back to NON_ROOT=true in your configuration and restart: docker compose up -d .
3. Check macOS File Sharing
Ensure that the path /Volumes/SeagateExos4x28TB_RAIDZ1/ is permitted in your Docker Desktop settings:
Go to Settings > Resources > File Sharing.
Add your external drive path to the list and click Apply & Restart.
4. Filesystem Considerations
Since you are using a RAIDZ1 volume on macOS, ensure the underlying filesystem supports POSIX permissions. If the drive is formatted as exFAT, it may not handle Linux-style UID/GID permissions correctly. In such cases, running with NON_ROOT=false might be the only stable workaround for that specific hardware setup.
I followed those steps. However, I am still unable to launch Seafile 13. I used to use Seafile 11, and Seafile 12 worked fine.
error log from docker desktop:
seafile-redis | 2026-04-13 17:04:19.624 | 1:C 13 Apr 2026 10:04:19.624 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
seafile-redis | 2026-04-13 17:04:19.624 | 1:C 13 Apr 2026 10:04:19.624 * Redis version=7.4.8, bits=64, commit=00000000, modified=0, pid=1, just started
seafile-redis | 2026-04-13 17:04:19.624 | 1:C 13 Apr 2026 10:04:19.624 * Configuration loaded
seafile-redis | 2026-04-13 17:04:19.624 | 1:M 13 Apr 2026 10:04:19.624 * monotonic clock: POSIX clock_gettime
seafile-redis | 2026-04-13 17:04:19.625 | 1:M 13 Apr 2026 10:04:19.625 * Running mode=standalone, port=6379.
seafile-redis | 2026-04-13 17:04:19.626 | 1:M 13 Apr 2026 10:04:19.625 * Server initialized
seafile-redis | 2026-04-13 17:04:19.628 | 1:M 13 Apr 2026 10:04:19.627 * Loading RDB produced by version 7.4.8
seafile-redis | 2026-04-13 17:04:19.628 | 1:M 13 Apr 2026 10:04:19.627 * RDB age 66 seconds
seafile-redis | 2026-04-13 17:04:19.628 | 1:M 13 Apr 2026 10:04:19.627 * RDB memory usage when created 0.94 Mb
seafile-redis | 2026-04-13 17:04:19.628 | 1:M 13 Apr 2026 10:04:19.627 * Done loading RDB, keys loaded: 0, keys expired: 0.
seafile-redis | 2026-04-13 17:04:19.628 | 1:M 13 Apr 2026 10:04:19.628 * DB loaded from disk: 0.002 seconds
seafile-redis | 2026-04-13 17:04:19.628 | 1:M 13 Apr 2026 10:04:19.628 * Ready to accept connections tcp
seafile-mariadb | 2026-04-13 17:04:19.667 | 2026-04-13 10:04:19+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:10.11.16+maria~ubu2204 started.
seafile-mariadb | 2026-04-13 17:04:19.911 | 2026-04-13 10:04:19+00:00 [Warn] [Entrypoint]: /sys/fs/cgroup///memory.pressure not writable, functionality unavailable to MariaDB
seafile-mariadb | 2026-04-13 17:04:19.912 | 2026-04-13 10:04:19+00:00 [Note] [Entrypoint]: Switching to dedicated user ‘mysql’
seafile-mariadb | 2026-04-13 17:04:19.916 | 2026-04-13 10:04:19+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:10.11.16+maria~ubu2204 started.
seafile-mariadb | 2026-04-13 17:04:20.060 | 2026-04-13 10:04:20+00:00 [Note] [Entrypoint]: MariaDB upgrade not required
seafile-mariadb | 2026-04-13 17:04:20.081 | 2026-04-13 10:04:20 0 [Note] Starting MariaDB 10.11.16-MariaDB-ubu2204 source revision 3218602d3100db9ce7a875511a591cddc173cc16 server_uid aSuB9hLjN8V5fw6LlX93dX/OfGg= as process 1
seafile-mariadb | 2026-04-13 17:04:20.102 | 2026-04-13 10:04:20 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
seafile-mariadb | 2026-04-13 17:04:20.103 | 2026-04-13 10:04:20 0 [Note] InnoDB: Number of transaction pools: 1
seafile-mariadb | 2026-04-13 17:04:20.103 | 2026-04-13 10:04:20 0 [Note] InnoDB: Using ARMv8 crc32 + pmull instructions
seafile-mariadb | 2026-04-13 17:04:20.107 | 2026-04-13 10:04:20 0 [Warning] mariadbd: io_uring_queue_init() failed with EPERM: sysctl kernel.io_uring_disabled has the value 2, or 1 and the user of the process is not a member of sysctl kernel.io_uring_group. (see man 2 io_uring_setup).
seafile-mariadb | 2026-04-13 17:04:20.107 | create_uring failed: falling back to libaio
seafile-mariadb | 2026-04-13 17:04:20.107 | 2026-04-13 10:04:20 0 [Note] InnoDB: Using Linux native AIO
seafile-mariadb | 2026-04-13 17:04:20.108 | 2026-04-13 10:04:20 0 [Note] InnoDB: innodb_buffer_pool_size_max=128m, innodb_buffer_pool_size=128m
seafile-mariadb | 2026-04-13 17:04:20.108 | 2026-04-13 10:04:20 0 [Note] InnoDB: Completed initialization of buffer pool
seafile-mariadb | 2026-04-13 17:04:20.110 | 2026-04-13 10:04:20 0 [Note] InnoDB: Buffered log writes (block size=512 bytes)
seafile-mariadb | 2026-04-13 17:04:20.144 | 2026-04-13 10:04:20 0 [Note] InnoDB: End of log at LSN=44808
seafile-mariadb | 2026-04-13 17:04:20.182 | 2026-04-13 10:04:20 0 [Note] InnoDB: 128 rollback segments are active.
seafile-mariadb | 2026-04-13 17:04:20.183 | 2026-04-13 10:04:20 0 [Note] InnoDB: Setting file ‘./ibtmp1’ size to 12.000MiB. Physically writing the file full; Please wait …
seafile-mariadb | 2026-04-13 17:04:20.183 | 2026-04-13 10:04:20 0 [Note] InnoDB: File ‘./ibtmp1’ size is now 12.000MiB.
seafile-mariadb | 2026-04-13 17:04:20.184 | 2026-04-13 10:04:20 0 [Note] InnoDB: log sequence number 44808; transaction id 14
seafile-mariadb | 2026-04-13 17:04:20.184 | 2026-04-13 10:04:20 0 [Note] Plugin ‘FEEDBACK’ is disabled.
seafile-mariadb | 2026-04-13 17:04:20.185 | 2026-04-13 10:04:20 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
seafile-mariadb | 2026-04-13 17:04:20.187 | 2026-04-13 10:04:20 0 [Warning] You need to use --log-bin to make --expire-logs-days or --binlog-expire-logs-seconds work.
seafile-mariadb | 2026-04-13 17:04:20.190 | 2026-04-13 10:04:20 0 [Note] InnoDB: Buffer pool(s) load completed at 260413 10:04:20
seafile-mariadb | 2026-04-13 17:04:20.191 | 2026-04-13 10:04:20 0 [Note] Server socket created on IP: ‘0.0.0.0’, port: ‘3306’.
seafile-mariadb | 2026-04-13 17:04:20.191 | 2026-04-13 10:04:20 0 [Note] Server socket created on IP: ‘::’, port: ‘3306’.
seafile-mariadb | 2026-04-13 17:04:20.224 | 2026-04-13 10:04:20 0 [Note] mariadbd: ready for connections.
seafile-mariadb | 2026-04-13 17:04:20.224 | Version: ‘10.11.16-MariaDB-ubu2204’ socket: ‘/run/mysqld/mysqld.sock’ port: 3306 mariadb. org binary distribution
seafile | 2026-04-13 17:04:30.724 | *** Running /etc/my_init.d/01_create_data_links.sh…
seafile | 2026-04-13 17:04:30.734 | *** Booting runit daemon…
seafile | 2026-04-13 17:04:30.734 | *** Runit started as PID 11
seafile | 2026-04-13 17:04:30.734 | *** Running /scripts/enterpoint.sh…
seafile | 2026-04-13 17:04:30.739 | 2026-04-13 17:04:30 Waiting Nginx
seafile | 2026-04-13 17:04:30.750 | nginx: [warn] conflicting server name “” on 0.0.0.0:80, ignored
seafile | 2026-04-13 17:04:30.946 | 2026-04-13 17:04:30 Nginx ready
seafile | 2026-04-13 17:04:30.947 | 2026-04-13 17:04:30 Create linux user seafile in container, please wait.
seafile | 2026-04-13 17:04:47.487 | 2026-04-13 17:04:47 This is an idle script (infinite loop) to keep container running.
seafile | 2026-04-13 17:04:47.617 | nginx: [warn] conflicting server name “” on 0.0.0.0:80, ignored
-enterpoint.log-
[2026-04-13 17:02:52] Waiting Nginx
[2026-04-13 17:02:52] Nginx ready
[2026-04-13 17:02:52] This is an idle script (infinite loop) to keep container running.
[2026-04-13 17:04:30] Waiting Nginx
[2026-04-13 17:04:30] Nginx ready
[2026-04-13 17:04:30] Create linux user seafile in container, please wait.
[2026-04-13 17:04:47] This is an idle script (infinite loop) to keep container running.
The “502 Bad Gateway” error confirms that your Nginx container is working, but it cannot reach the Seahub service (running on port 8000 internally). In Seafile 13, this is often a sign that Seahub failed to start.
Since you are using an external RAIDZ1 volume on macOS with NON_ROOT=true, the most likely cause is that the internal seafile user (UID 8000) still cannot write to specific sub-directories required for Seahub to start (like logs or pids).
Please try the following steps to diagnose and fix this:
Verify Seahub Logs:
Check the internal Seahub logs for specific Python errors. You can find them on your host at: /Volumes/SeagateExos4x28TB_RAIDZ1/seafile/app/seafile/logs/seahub.log
If you see “Permission denied” errors here, the NON_ROOT mode is still struggling with the macOS filesystem mapping.
Test with Root Mode:
To rule out macOS filesystem/UID mapping issues, temporarily set NON_ROOT=false in your docker-compose.yml, run docker compose up -d, and see if the 502 error clears. If it works as root, the issue is strictly how macOS handles permissions on your external RAID volume.
To further debug the “502 Bad Gateway” error, we need to see the actual error message Seahub produces when it attempts to start. In the current setup, Seahub runs in “daemon” mode (in the background), which often swallows the initial startup errors.
I suggest you manually start Seahub in the foreground to catch the error:
Enter the Seafile container:
docker exec -it seafile /bin/bash
Modify Gunicorn settings:
Navigate to your configuration directory (usually /shared/seafile/conf) and edit gunicorn.conf.py. Find the line that says daemon = True and change it to:
daemon = False
Attempt to start Seahub manually:
From within the container (usually in /opt/seafile/seafile-server-latest), run:
./seahub.sh start
By running it this way, Seahub will not return to the command prompt. Instead, it will stay active in your terminal and print the full Python traceback or any “Permission denied” errors directly to your screen. This should reveal exactly why the service is failing to bind to port 8000.
Once you find the error, you can revert the daemon setting back to True and restart the container.
The path should be /opt/seafile/conf/gunicorn.conf.py. If the file is not generated, your initialization process is not correctly finished.
I rechecked your inital post, it seems that you have modified the yml files. According to seafile setup manual, you should not modify the yml files directly, only modify the environment file .env. There likely to be some errors after you modify yml files.