From de9aee70a8263a539ae9c5b8f461538348f6a518 Mon Sep 17 00:00:00 2001 From: Matthew Pomes Date: Mon, 1 Sep 2025 20:14:33 -0500 Subject: [PATCH] Add gitea to homelab --- build-certs.sh | 1 + docker-compose.yaml | 17 +++++++++++ nginx/sites-enabled/gitea | 62 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 nginx/sites-enabled/gitea diff --git a/build-certs.sh b/build-certs.sh index 28ea9d5..2f80fc9 100644 --- a/build-certs.sh +++ b/build-certs.sh @@ -1,6 +1,7 @@ docker compose run --rm certbot certonly --webroot --webroot-path /var/www/certbot/ \ -d loadingm.xyz \ + -d gitea.loadingm.xyz \ -d auth.loadingm.xyz \ -d jellyfin.loadingm.xyz \ -d jellyseerr.loadingm.xyz \ diff --git a/docker-compose.yaml b/docker-compose.yaml index b66a344..c10db31 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -55,6 +55,7 @@ services: image: itzg/minecraft-server:latest tty: true stdin_open: true + restart: unless-stopped ports: - "25565:25565" environment: @@ -74,6 +75,20 @@ services: ENABLE_ROLLING_LOGS: "true" volumes: - "/opt/minecraft:/data" + gitea: + image: gitea/gitea:latest + environment: + - USER_UID=1000 + - USER_GID=1000 + restart: unless-stopped + networks: + - gitea + volumes: + - /data/gitea/data:/data + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + ports: + - "222:22" # calibre: # image: "linuxserver/calibre-web" # 5d-diplomacy-frontend: @@ -107,3 +122,5 @@ networks: external: false auth: external: false + gitea: + external: false diff --git a/nginx/sites-enabled/gitea b/nginx/sites-enabled/gitea new file mode 100644 index 0000000..1438bfa --- /dev/null +++ b/nginx/sites-enabled/gitea @@ -0,0 +1,62 @@ +server { + listen 80; + listen [::]:80; + server_name gitea.loadingm.xyz; + + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + # Uncomment to redirect HTTP to HTTPS + location / { + return 301 https://$host$request_uri; + } +} + +server { + # Nginx versions 1.25+ + listen 443 ssl; + listen [::]:443 ssl; + http2 on; + + server_name gitea.loadingm.xyz; + + ## The default `client_max_body_size` is 1M, this might not be enough for some posters, etc. + client_max_body_size 20M; + + ssl_certificate /etc/letsencrypt/live/loadingm.xyz/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/loadingm.xyz/privkey.pem; + # include /etc/letsencrypt/options-ssl-nginx.conf; + # ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + ssl_trusted_certificate /etc/letsencrypt/live/loadingm.xyz/chain.pem; + + # Security / XSS Mitigation Headers + add_header X-Content-Type-Options "nosniff"; + + # 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; + + # 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' 'unsafe-eval' 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'"; + + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + location / { + # Proxy main karakeep traffic + proxy_pass http://gitea: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; + } +}