From 865c02a3a45650d5b9ac75ccbbd4c5d13305527e Mon Sep 17 00:00:00 2001 From: Matthew Pomes Date: Sat, 27 Sep 2025 01:15:39 -0500 Subject: [PATCH] Add gpodder-rs setup --- docker-compose.yaml | 11 ++++++++++ nginx/sites-enabled/gpodder | 42 +++++++++++++++++++++++-------------- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 2a71f4f..b11b911 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -30,6 +30,8 @@ networks: external: false gitea: external: false + gpodder: + external: false services: web: image: "nginx" @@ -50,6 +52,7 @@ services: - jellyfin-int - auth - gitea + - gpodder depends_on: - jellyfin - ollama-webui @@ -57,6 +60,7 @@ services: - authelia - qbittorrent - gitea + - gpodder logging: &logging options: max-size: "50m" @@ -144,6 +148,13 @@ services: logging: *logging depends_on: - gitea + gpodder: + image: gitea.loadingm.xyz/the10thwiz/gpodder-rs:latest + networks: + - gpodder + volumes: + - /data/gpodder:/data + logging: *logging # calibre: # image: "linuxserver/calibre-web" # 5d-diplomacy-frontend: diff --git a/nginx/sites-enabled/gpodder b/nginx/sites-enabled/gpodder index 64eb4b5..0698b78 100644 --- a/nginx/sites-enabled/gpodder +++ b/nginx/sites-enabled/gpodder @@ -48,23 +48,33 @@ server { # ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; ssl_trusted_certificate /etc/letsencrypt/live/loadingm.xyz/chain.pem; - root /data/site; + # Security / XSS Mitigation Headers + add_header X-Content-Type-Options "nosniff"; - location /hosted { - index index.html; - autoindex on; - } + # Permissions policy. May cause issues with some clients + add_header Permissions-Policy "accelerometer=(), ambient-light-sensor=(), battery=(), bluetooth=(), camera=(), clipboard-read=(), display-capture=(), document-domain=(), encrypted-media=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), interest-cohort=(), keyboard-map=(), local-fonts=(), magnetometer=(), microphone=(), payment=(), publickey-credentials-get=(), serial=(), sync-xhr=(), usb=(), xr-spatial-tracking=()" always; - location / { - # First attempt to serve request as file, then - # as directory, then fall back to displaying a 404. - try_files $uri $uri/ =404; - } + # Content Security Policy + # See: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP + # Enforces https content and restricts JS/CSS to origin + # External Javascript (such as cast_sender.js for Chromecast) must be whitelisted. + add_header Content-Security-Policy "default-src https: data: blob: ; img-src 'self' https://* ; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' https://www.gstatic.com https://www.youtube.com blob:; worker-src 'self' blob:; connect-src 'self'; object-src 'none'; frame-ancestors 'self'; font-src 'self'"; - # deny access to .htaccess files, if Apache's document root - # concurs with nginx's one - # - #location ~ /\.ht { - # deny all; - #} + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + location / { + # Proxy main karakeep traffic + proxy_pass http://gpodder:3000; + 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 X-Forwarded-Protocol $scheme; + proxy_set_header X-Forwarded-Host $http_host; + + # Disable buffering when the nginx proxy gets very resource heavy upon streaming + proxy_buffering off; + } }