Patch: Various additions (#564)

- Added rich Prowlarr search results for whitelisted indexers
- Added torznab query for whitelisted indexers
- Added flags for all Prowlarr indexers
- Added completed external download retry mechanism and "locating" state
- Added client side preference storage of Book/Audiobook search
preference
- Fixed reverse proxy base URL in edge cases
- Added gevent locking for I/O operations, keeps healthcheck alive on
intensive processing operations
- Added M4A supported audiobook option
- Improved file transfer counting and logging with hardlink fallback
warnings
- Fixed proxy auth header for REMOTE_USER scenario
- Dependency tweak for internal bypasser
This commit is contained in:
Alex
2026-01-31 12:53:11 +00:00
committed by GitHub
parent 86082c999c
commit e5ccabe1ef
35 changed files with 1867 additions and 563 deletions
+3 -119
View File
@@ -4,7 +4,7 @@ Shelfmark can run behind a reverse proxy at the root path (recommended) or under
## Root path setup (Recommended)
If you can serve Shelfmark at the root path (`https://shelfmark.example.com/`), leave `URL_BASE` empty. This is the simplest option and avoids the workarounds needed for subpath deployments.
If you can serve Shelfmark at the root path (`https://shelfmark.example.com/`), leave `URL_BASE` empty. This is the simplest option and avoids extra subpath configuration.
```nginx
server {
@@ -26,7 +26,7 @@ server {
## Subpath setup
Running Shelfmark under a subpath like `/shelfmark` requires additional configuration due to how the frontend generates certain URLs.
Running Shelfmark under a subpath like `/shelfmark` is supported without extra rewrite rules.
### 1. Set the base path in Shelfmark
@@ -35,7 +35,7 @@ Running Shelfmark under a subpath like `/shelfmark` requires additional configur
### 2. Configure your reverse proxy
The frontend generates some URLs at the root level (`/socket.io/`, `/api/`, `/logo.png`) regardless of the `URL_BASE` setting. You'll need to add proxy rules to handle these paths.
All Shelfmark paths (UI, API, assets, Socket.IO) are served under the base path. A single location block is enough.
---
@@ -44,56 +44,6 @@ The frontend generates some URLs at the root level (`/socket.io/`, `/api/`, `/lo
**Complete Nginx configuration for subpath deployment:**
```nginx
# Redirect /logo.png to subpath (frontend bug workaround)
location = /logo.png {
return 302 /shelfmark/logo.png;
}
# Proxy root /api/ to /shelfmark/api/ (frontend generates root paths)
location /api/ {
proxy_pass http://shelfmark:8084/shelfmark/api/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 86400;
proxy_send_timeout 86400;
proxy_buffering off;
}
# Proxy root /socket.io/ to backend (frontend connects to root)
location /socket.io/ {
proxy_pass http://shelfmark:8084/socket.io/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
proxy_send_timeout 86400;
proxy_buffering off;
}
# Rewrite /shelfmark/socket.io/ to /socket.io/ on backend
# (Socket.IO endpoint is always at /socket.io/ regardless of URL_BASE)
location ^~ /shelfmark/socket.io/ {
proxy_pass http://shelfmark:8084/socket.io/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
proxy_send_timeout 86400;
proxy_buffering off;
}
# Main shelfmark location
location /shelfmark/ {
proxy_pass http://shelfmark:8084/shelfmark/;
proxy_http_version 1.1;
@@ -171,60 +121,6 @@ error_page 401 =302 https://auth.example.com/?rd=$target_url;
# Include Authelia auth endpoint in your server block
include /etc/nginx/snippets/authelia-authrequest.conf;
# Redirect /logo.png to subpath (frontend bug workaround)
location = /logo.png {
return 302 /shelfmark/logo.png;
}
# Proxy root /api/ to /shelfmark/api/ (frontend generates root paths)
location /api/ {
include /etc/nginx/snippets/authelia-location.conf;
proxy_pass http://shelfmark:8084/shelfmark/api/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 86400;
proxy_send_timeout 86400;
proxy_buffering off;
}
# Proxy root /socket.io/ to backend (frontend connects to root)
location /socket.io/ {
include /etc/nginx/snippets/authelia-location.conf;
proxy_pass http://shelfmark:8084/socket.io/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
proxy_send_timeout 86400;
proxy_buffering off;
}
# Rewrite /shelfmark/socket.io/ to /socket.io/ on backend
location ^~ /shelfmark/socket.io/ {
include /etc/nginx/snippets/authelia-location.conf;
proxy_pass http://shelfmark:8084/socket.io/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
proxy_send_timeout 86400;
proxy_buffering off;
}
# Main shelfmark location
location /shelfmark/ {
include /etc/nginx/snippets/authelia-location.conf;
@@ -246,18 +142,6 @@ location /shelfmark/ {
---
## Known issues with subpath deployments
The following issues require the workarounds above:
1. **Socket.IO connects to root**: The frontend Socket.IO client connects to `https://yourdomain.com/socket.io/` instead of `https://yourdomain.com/shelfmark/socket.io/`
2. **API calls use root path**: Cover image requests and some API calls go to `/api/` instead of `/shelfmark/api/`
3. **Logo uses root path**: The logo is requested from `/logo.png` instead of `/shelfmark/logo.png`
4. **Socket.IO backend path**: The Socket.IO endpoint on the backend is always at `/socket.io/`, not `/shelfmark/socket.io/`, regardless of the `URL_BASE` setting
## Health checks
Health checks work at `/shelfmark/api/health` when using a subpath configuration.