The Nginx process and logs you are seeing inside the container are expected. Starting with the “multi-component” (mc) images, Seafile uses an internal Nginx instance inside the container to act as a local dispatcher.
This internal Nginx routes traffic to the various services (Seahub, Seaf-server, WebDAV, etc.) within the same container. This is why you only need to expose port 80 to your external Nginx. The external proxy no longer needs specific blocks for /seafhttp, /media, or /seafdav because the internal Nginx handles those routes and simplifies the external configuration.
To summarize:
- Internal Nginx (inside the container): Handles internal routing between components. It is a core part of the
seafile-mcimage and cannot be opted out of without building a custom architecture. - External Proxy (Caddy/Your Nginx): Handles SSL and external access, pointing to the container’s exposed port.
Regarding your request for the documentation: the reason those blocks were removed is that they are now handled internally. For a standard Docker-based v12 deployment, your external Nginx only needs the main / location block pointing to the Seafile container’s port 80, as described in the Use other reverse proxy guide.
If you have specific needs to bypass the internal Nginx entirely, you would need to revert to a standalone component architecture, but for the official Docker image, this “double proxy” (External Nginx → Internal Nginx → Service) is the designed behavior.
I also suggest you to use 13.0 version, as 12.0 is already outdated.