# /etc/nginx/sites-available/nik4nao.home.arpa
# WebSocket upgrade helper (for Jellyfin)
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name nik4nao.home.arpa;
access_log off;
error_log /var/log/nginx/nik4naohomearpa_error.log warn;
# ---- Convenience redirects ----
location = / {
return 302 /admin/;
}
location = /pihole {
return 302 /admin/;
}
# ---- favicon (avoid noisy 404 in browser) ----
# Put a favicon.ico in /var/www/html if you want a real icon.
location = /favicon.ico {
root /var/www/html;
access_log off;
try_files /favicon.ico =404;
}
location /pihole/ {
return 301 /admin/;
}
# ---- Jellyfin at /jellyfin/ ----
location = /jellyfin {
return 302 /jellyfin/;
}
location /jellyfin/ {
proxy_pass http://jellyfin_upstream/; # uses upstream (or use the raw URL)
include snippets/proxy-common.conf;
# Jellyfin behind subpath specifics
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Prefix /jellyfin;
}
# ---- Jellyfin at /anime/ ----
location = /anime {
return 302 /anime/;
}
location /anime/ {
proxy_pass http://djellyfin_upstream/; # uses upstream (or use the raw URL)
proxy_next_upstream error timeout invalid_header http_502 http_503 http_504;
include snippets/proxy-common.conf;
# Jellyfin behind subpath specifics
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Prefix /anime;
}
# ---- Pi-hole admin at /admin/ ----
# Pi-hole’s UI lives under /admin/, so keep the trailing slash in proxy_pass.
location /admin/ {
proxy_pass http://pihole_upstream/admin/;
include snippets/proxy-common.conf;
proxy_set_header X-Forwarded-Host $host;
}
# Pi-hole API (some UI calls hit /api/)
location /api/ {
proxy_pass http://pihole_upstream/api/;
include snippets/proxy-common.conf;
proxy_set_header X-Forwarded-Host $host;
}
# redirect /watch-party -> /watch-party/
location = /watch-party {
return 302 /watch-party/;
}
# proxy ONLY /watch-party/*, keeping the prefix
location ^~ /watch-party/ {
proxy_pass http://watchparty_upstream; # ← no trailing slash (preserve /watch-party)
include snippets/proxy-common.conf;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Prefix /watch-party;
# For Vite HMR / websockets
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
# ---- qBittorrent at /qbt/ ----
location = /qbt {
return 302 /qbt/;
}
location ^~ /qbt/ {
proxy_pass http://qbt_upstream/;
include snippets/proxy-common.conf;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Prefix /qbt;
proxy_cookie_path / /qbt/;
proxy_redirect / /qbt/;
}
# ---- JDownloader2 at /jd2/ ----
location = /jd2 {
return 302 /jd2/;
}
location /jd2/ {
proxy_pass http://127.0.0.1:5800/;
include snippets/proxy-common.conf;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Prefix /jd2;
}
# ---- JDownloader-Bridge at /jd-bridge/ ----
location = /jd-bridge {
return 302 /jd-bridge/;
}
location /jd-bridge/ {
proxy_pass http://127.0.0.1:8088/;
include snippets/proxy-common.conf;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Prefix /jd-bridge;
}
# ---- Dashy at /dashy/ ----
location = /dashy {
return 302 /dashy/;
}
location ^~ /dashy/ {
proxy_pass http://127.0.0.1:8084/;
include snippets/proxy-common.conf;
add_header X-Dashy-Proxy 1 always;
access_log /var/log/nginx/dashy_access.log;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Prefix /dashy;
proxy_redirect / /dashy/;
proxy_cookie_path / /dashy/;
proxy_set_header Accept-Encoding "";
sub_filter_once off;
sub_filter_types text/html text/css application/javascript application/json;
sub_filter '' '';
sub_filter 'href="/' 'href="/dashy/';
sub_filter 'src="/' 'src="/dashy/';
sub_filter 'content="/' 'content="/dashy/';
sub_filter 'action="/' 'action="/dashy/';
sub_filter 'url(/' 'url(/dashy/';
}
}