error_log /var/log/nginx/error.log warn; # Default catch-all for unknown subdomains (HTTP) server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/error-pages; error_page 404 /unknown-host.html; location / { return 404; } location = /unknown-host.html { internal; } } # Default catch-all for unknown subdomains (HTTPS) server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name _; ssl_certificate /var/letsencrypt/etc/live/swave.lol/fullchain.pem; ssl_certificate_key /var/letsencrypt/etc/live/swave.lol/privkey.pem; root /usr/share/nginx/error-pages; error_page 404 /unknown-host.html; location / { return 404; } location = /unknown-host.html { internal; } } server { listen 80; listen [::]:80; server_name swave.lol blog.swave.lol ghost.swave.lol jenkins.swave.lol cgit.swave.lol gerrit.swave.lol nexus.swave.lol registry.swave.lol auth.swave.lol; location / { rewrite ^ https://$host$request_uri? permanent; } #for certbot challenges (renewal process) location ~ /.well-known/acme-challenge { allow all; root /var/letsencrypt/lts_site; } } # Ghost — swave.lol, blog.swave.lol, ghost.swave.lol server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name swave.lol blog.swave.lol ghost.swave.lol; server_tokens off; ssl_certificate /var/letsencrypt/etc/live/swave.lol/fullchain.pem; ssl_certificate_key /var/letsencrypt/etc/live/swave.lol/privkey.pem; ssl_buffer_size 8k; ssl_dhparam /etc/ssl/certs/dhparam-2048.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_ecdh_curve secp384r1; ssl_session_tickets off; # OCSP stapling ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8; charset utf-8; # Cgit static assets (css, images) location /cgit-css/ { proxy_pass http://cgit:80/cgit-css/; } # Cgit via path prefix on main domain # cgit generates links from virtual-root=/ so we rewrite them to /cgit/ location /cgit { proxy_pass http://cgit:80/; 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; # Rewrite cgit links to include /cgit prefix sub_filter 'href="/' 'href="/cgit/'; sub_filter "href='/" "href='/cgit/"; sub_filter 'action="/' 'action="/cgit/'; sub_filter "action='/" "action='/cgit/"; sub_filter_once off; sub_filter_types text/html; # Rewrite any redirects from cgit itself proxy_redirect / /cgit/; } # Gerrit — redirect to subdomain (Gerrit doesn't support subpath proxying) location = /gerrit { return 301 https://gerrit.swave.lol/; } location ~ ^/gerrit/(.*)$ { return 301 https://gerrit.swave.lol/$1; } # Jenkins — redirect to subdomain (strips /jenkins prefix) location = /jenkins { return 301 https://jenkins.swave.lol/; } location ~ ^/jenkins/(.*)$ { return 301 https://jenkins.swave.lol/$1; } # Netdata — requires Authelia login location = /netdata { return 301 /netdata/; } location /netdata/ { auth_request /_authelia-auth; auth_request_set $authelia_user $upstream_http_remote_user; proxy_pass http://172.24.0.2:19999/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_read_timeout 86400; # Prevent browser caching — ensures fresh requests always hit auth_request add_header Cache-Control "no-store" always; } # Nexus — no auth_request, Nexus handles its own authentication location /nexus { proxy_pass http://nexus:8081/nexus; 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; client_max_body_size 1G; } # Reverse proxy to Ghost location / { proxy_pass http://ghost:2368; 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; } # Authelia forward-auth subrequest endpoint location = /_authelia-auth { internal; resolver 127.0.0.11 valid=30s; set $authelia_upstream http://authelia:9091/api/verify; proxy_pass $authelia_upstream; proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_set_header Cookie $http_cookie; proxy_set_header X-Original-URL $scheme://$http_host$request_uri; proxy_set_header X-Forwarded-Method $request_method; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $http_host; proxy_set_header X-Forwarded-Uri $request_uri; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } error_page 401 = @authelia_login_redirect; location @authelia_login_redirect { return 302 https://auth.swave.lol/?rd=$scheme://$http_host$request_uri; } } # Jenkins — jenkins.swave.lol server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name jenkins.swave.lol; server_tokens off; ssl_certificate /var/letsencrypt/etc/live/swave.lol/fullchain.pem; ssl_certificate_key /var/letsencrypt/etc/live/swave.lol/privkey.pem; ssl_buffer_size 8k; ssl_dhparam /etc/ssl/certs/dhparam-2048.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_ecdh_curve secp384r1; ssl_session_tickets off; # OCSP stapling ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8; charset utf-8; # OIDC callback — must bypass auth_request so Jenkins can process the code/state location = /securityRealm/finishLogin { proxy_pass http://jenkins:8080/securityRealm/finishLogin; 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; } location / { auth_request /_authelia-auth; auth_request_set $authelia_user $upstream_http_remote_user; proxy_pass http://jenkins:8080; 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; } # Authelia forward-auth subrequest endpoint location = /_authelia-auth { internal; resolver 127.0.0.11 valid=30s; set $authelia_upstream http://authelia:9091/api/verify; proxy_pass $authelia_upstream; proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_set_header Cookie $http_cookie; proxy_set_header X-Original-URL $scheme://$http_host$request_uri; proxy_set_header X-Forwarded-Method $request_method; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $http_host; proxy_set_header X-Forwarded-Uri $request_uri; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } error_page 401 = @authelia_login_redirect; location @authelia_login_redirect { return 302 https://auth.swave.lol/?rd=$scheme://$http_host$request_uri; } } # Cgit — cgit.swave.lol server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name cgit.swave.lol; server_tokens off; ssl_certificate /var/letsencrypt/etc/live/swave.lol/fullchain.pem; ssl_certificate_key /var/letsencrypt/etc/live/swave.lol/privkey.pem; ssl_buffer_size 8k; ssl_dhparam /etc/ssl/certs/dhparam-2048.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_ecdh_curve secp384r1; ssl_session_tickets off; # OCSP stapling ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8; charset utf-8; location / { proxy_pass http://cgit:80; 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; } } # Gerrit — gerrit.swave.lol server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name gerrit.swave.lol; server_tokens off; ssl_certificate /var/letsencrypt/etc/live/swave.lol/fullchain.pem; ssl_certificate_key /var/letsencrypt/etc/live/swave.lol/privkey.pem; ssl_buffer_size 8k; ssl_dhparam /etc/ssl/certs/dhparam-2048.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_ecdh_curve secp384r1; ssl_session_tickets off; # OCSP stapling ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8; charset utf-8; # /login/ — auth_request fires here, X-Forwarded-User injected, Gerrit creates session location /login { auth_request /_authelia-auth; auth_request_set $authelia_user $upstream_http_remote_user; proxy_pass http://gerrit:8080/login; 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-User $authelia_user; proxy_redirect http://gerrit:8080/ https://gerrit.swave.lol/; proxy_redirect ~^http://[^/]+/(.*)$ https://gerrit.swave.lol/$1; } # All other paths — no auth_request, anonymous access allowed, Gerrit session cookie handles login state location / { proxy_pass http://gerrit:8080; 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_redirect http://gerrit:8080/ https://gerrit.swave.lol/; proxy_redirect ~^http://[^/]+/(.*)$ https://gerrit.swave.lol/$1; } # Authelia forward-auth subrequest endpoint location = /_authelia-auth { internal; resolver 127.0.0.11 valid=30s; set $authelia_upstream http://authelia:9091/api/verify; proxy_pass $authelia_upstream; proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_set_header Cookie $http_cookie; proxy_set_header X-Original-URL $scheme://$http_host$request_uri; proxy_set_header X-Forwarded-Method $request_method; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $http_host; proxy_set_header X-Forwarded-Uri $request_uri; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } error_page 401 = @authelia_login_redirect; location @authelia_login_redirect { return 302 https://auth.swave.lol/?rd=$scheme://$http_host$request_uri; } } # Nexus — nexus.swave.lol server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name nexus.swave.lol; server_tokens off; ssl_certificate /var/letsencrypt/etc/live/swave.lol/fullchain.pem; ssl_certificate_key /var/letsencrypt/etc/live/swave.lol/privkey.pem; ssl_buffer_size 8k; ssl_dhparam /etc/ssl/certs/dhparam-2048.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_ecdh_curve secp384r1; ssl_session_tickets off; # OCSP stapling ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8; charset utf-8; client_max_body_size 1G; location = / { return 302 https://$host/nexus/; } # No auth_request — Nexus handles its own authentication location /nexus { proxy_pass http://nexus:8081/nexus; 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; } } # Docker Registry — registry.swave.lol server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name registry.swave.lol; server_tokens off; ssl_certificate /var/letsencrypt/etc/live/swave.lol/fullchain.pem; ssl_certificate_key /var/letsencrypt/etc/live/swave.lol/privkey.pem; ssl_buffer_size 8k; ssl_dhparam /etc/ssl/certs/dhparam-2048.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_ecdh_curve secp384r1; ssl_session_tickets off; # OCSP stapling ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8; charset utf-8; client_max_body_size 2G; chunked_transfer_encoding on; # No auth_request — Nexus handles Docker Basic Auth directly location / { proxy_pass http://nexus:5000; 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; } error_page 401 = @authelia_login_redirect; location @authelia_login_redirect { return 302 https://auth.swave.lol/?rd=$scheme://$http_host$request_uri; } } # Authelia — auth.swave.lol server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name auth.swave.lol; server_tokens off; ssl_certificate /var/letsencrypt/etc/live/swave.lol/fullchain.pem; ssl_certificate_key /var/letsencrypt/etc/live/swave.lol/privkey.pem; ssl_buffer_size 8k; ssl_dhparam /etc/ssl/certs/dhparam-2048.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_ecdh_curve secp384r1; ssl_session_tickets off; # OCSP stapling ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8; charset utf-8; location / { resolver 127.0.0.11 valid=30s; set $authelia_upstream http://authelia:9091; proxy_pass $authelia_upstream; 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-Host $http_host; } }