diff --git a/config/nginx/homelab.conf b/config/nginx/homelab.conf index 74d9d45..8bf1877 100644 --- a/config/nginx/homelab.conf +++ b/config/nginx/homelab.conf @@ -1,21 +1,39 @@ # DEPLOYMENT LOCATION: /etc/nginx/sites-available/homelab -# Deploy with: sudo cp nginx-homelab.conf /etc/nginx/sites-available/homelab -# Enable with: sudo ln -s /etc/nginx/sites-available/homelab /etc/nginx/sites-enabled/homelab +# Final working config with all services and fixed WebDAV server { - server_name ak-homelab.duckdns.org; + listen 80 default_server; + server_name ak-homelab.duckdns.org _; + + # Redirect HTTP to HTTPS + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl default_server; + server_name ak-homelab.duckdns.org _; + + # Critical: Disable automatic redirects for WebDAV + merge_slashes off; # Security headers add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; - # Main landing page + # Main landing page - highest priority location / { root /var/www/homelab; - index index.html index.htm; + index index.html; try_files $uri $uri/ =404; } + + # Custom error pages to prevent fallback to default nginx html + error_page 404 /404.html; + location = /404.html { + root /var/www/homelab; + internal; + } # Gitea reverse proxy location /gitea/ { @@ -35,9 +53,12 @@ server { proxy_read_timeout 60s; } - # Copyparty file server - location /files/ { - proxy_pass http://127.0.0.1:8082/files/; + # Copyparty file server - WORKING WebDAV config + location ~ ^/files(/.*)?$ { + # Explicitly allow WebDAV methods + limit_except GET POST PUT DELETE PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK { deny all; } + + proxy_pass http://127.0.0.1:8082/files$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; @@ -48,21 +69,23 @@ server { proxy_set_header Destination $http_destination; proxy_set_header Overwrite $http_overwrite; proxy_set_header If $http_if; + proxy_set_header Lock-Token $http_lock_token; - # Handle websockets for live updates - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; + # Large file upload support + client_max_body_size 10G; + client_body_buffer_size 128k; - # Increase timeouts for large file uploads + # Upload timeout settings proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; - # Increase client max body size for file uploads - client_max_body_size 10G; - - # Allow WebDAV methods + # Critical: Streaming uploads for WebDAV + proxy_buffering off; proxy_request_buffering off; + + # Critical: Disable nginx response modifications + proxy_redirect off; } # Jellyfin media server @@ -92,23 +115,8 @@ server { proxy_request_buffering off; } - listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/ak-homelab.duckdns.org/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/ak-homelab.duckdns.org/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot - -} - -server { - if ($host = ak-homelab.duckdns.org) { - return 301 https://$host$request_uri; - } # managed by Certbot - - - listen 80; - server_name ak-homelab.duckdns.org; - return 404; # managed by Certbot - - } \ No newline at end of file