From 167c13f954452f5d141535c9625ef6aa219c9a2f Mon Sep 17 00:00:00 2001 From: zimasu Date: Wed, 14 Oct 2026 16:53:04 +0000 Subject: [PATCH] initial snapshot: nginx + docker-compose configs --- .gitignore | 5 +++ README.md | 14 +++++++++ nginx/ai.zidanesyukri.me | 39 +++++++++++++++++++++++ nginx/aksara.ink | 45 +++++++++++++++++++++++++++ nginx/drop-ip | 6 ++++ nginx/gitea.zidanesyukri.me | 25 +++++++++++++++ nginx/n8n.zidanesyukri.me | 25 +++++++++++++++ nginx/zidanesyukri.me | 19 +++++++++++ services/gitea/docker-compose.yml | 17 ++++++++++ services/n8n/docker-compose.yml | 15 +++++++++ services/openwebui/docker-compose.yml | 12 +++++++ 11 files changed, 222 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 nginx/ai.zidanesyukri.me create mode 100644 nginx/aksara.ink create mode 100644 nginx/drop-ip create mode 100644 nginx/gitea.zidanesyukri.me create mode 100644 nginx/n8n.zidanesyukri.me create mode 100644 nginx/zidanesyukri.me create mode 100644 services/gitea/docker-compose.yml create mode 100644 services/n8n/docker-compose.yml create mode 100644 services/openwebui/docker-compose.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..26cd4be --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +# No data dirs, no secrets +*.pem +*.key +.env +*_secret* diff --git a/README.md b/README.md new file mode 100644 index 0000000..6acc63d --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# hetzner infra + +Server: aksara (Hetzner) +IP: 62.238.100.84 + +## Services +- Open WebUI → https://ai.zidanesyukri.me +- n8n → https://n8n.zidanesyukri.me +- Gitea → https://gitea.zidanesyukri.me +- aksara.ink → /var/www/aksara.ink (PHP) + +## Structure +- `nginx/` — all vhost configs +- `services/` — docker-compose files per service diff --git a/nginx/ai.zidanesyukri.me b/nginx/ai.zidanesyukri.me new file mode 100644 index 0000000..a21fe04 --- /dev/null +++ b/nginx/ai.zidanesyukri.me @@ -0,0 +1,39 @@ +server { + listen 80; + server_name ai.zidanesyukri.me; + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + server_name ai.zidanesyukri.me; + + ssl_certificate /etc/letsencrypt/live/ai.zidanesyukri.me/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/ai.zidanesyukri.me/privkey.pem; + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + + location / { + proxy_pass http://localhost:8080; + proxy_http_version 1.1; + + # WebSocket & Connection Upgrades + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + # Standard Proxy Headers + 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; + + # Disable Buffering for Real-time AI Streaming + proxy_buffering off; + proxy_cache off; + + # Extended Timeouts for Long AI Inferences + proxy_read_timeout 86400; + proxy_send_timeout 86400; + proxy_connect_timeout 300; + } +} diff --git a/nginx/aksara.ink b/nginx/aksara.ink new file mode 100644 index 0000000..2c79e57 --- /dev/null +++ b/nginx/aksara.ink @@ -0,0 +1,45 @@ +server { + + server_name aksara.ink www.aksara.ink; + root /var/www/aksara.ink; + index index.php index.html; + + location / { + try_files $uri $uri/ =404; + } + + location ~ \.php$ { + include snippets/fastcgi-php.conf; + fastcgi_pass unix:/run/php/php8.5-fpm.sock; + } + + listen [::]:443 ssl ipv6only=on; # managed by Certbot + listen 443 ssl; # managed by Certbot + ssl_certificate /etc/letsencrypt/live/aksara.ink/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/aksara.ink/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 = www.aksara.ink) { + return 301 https://$host$request_uri; + } # managed by Certbot + + + if ($host = aksara.ink) { + return 301 https://$host$request_uri; + } # managed by Certbot + + + listen 80; + listen [::]:80; + + server_name aksara.ink www.aksara.ink; + return 404; # managed by Certbot + + + + +} diff --git a/nginx/drop-ip b/nginx/drop-ip new file mode 100644 index 0000000..dcb9e90 --- /dev/null +++ b/nginx/drop-ip @@ -0,0 +1,6 @@ +server { + listen 80 default_server; + listen [::]:80 default_server; + server_name _; + return 444; +} diff --git a/nginx/gitea.zidanesyukri.me b/nginx/gitea.zidanesyukri.me new file mode 100644 index 0000000..7f6f0fc --- /dev/null +++ b/nginx/gitea.zidanesyukri.me @@ -0,0 +1,25 @@ +server { + server_name gitea.zidanesyukri.me; + location / { + proxy_pass http://localhost:3000; + } + + listen 443 ssl; # managed by Certbot + ssl_certificate /etc/letsencrypt/live/gitea.zidanesyukri.me/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/gitea.zidanesyukri.me/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 = gitea.zidanesyukri.me) { + return 301 https://$host$request_uri; + } # managed by Certbot + + + listen 80; + server_name gitea.zidanesyukri.me; + return 404; # managed by Certbot + + +} \ No newline at end of file diff --git a/nginx/n8n.zidanesyukri.me b/nginx/n8n.zidanesyukri.me new file mode 100644 index 0000000..08bec9c --- /dev/null +++ b/nginx/n8n.zidanesyukri.me @@ -0,0 +1,25 @@ +server { + server_name n8n.zidanesyukri.me; + location / { + proxy_pass http://localhost:5678; + } + + listen 443 ssl; # managed by Certbot + ssl_certificate /etc/letsencrypt/live/n8n.zidanesyukri.me/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/n8n.zidanesyukri.me/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 = n8n.zidanesyukri.me) { + return 301 https://$host$request_uri; + } # managed by Certbot + + + listen 80; + server_name n8n.zidanesyukri.me; + return 404; # managed by Certbot + + +} \ No newline at end of file diff --git a/nginx/zidanesyukri.me b/nginx/zidanesyukri.me new file mode 100644 index 0000000..5e9cc68 --- /dev/null +++ b/nginx/zidanesyukri.me @@ -0,0 +1,19 @@ +server { + listen 80; + server_name zidanesyukri.me; + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + server_name zidanesyukri.me; + + ssl_certificate /etc/letsencrypt/live/zidanesyukri.me-0001/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/zidanesyukri.me-0001/privkey.pem; + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + + # Placeholder — to be decided + return 200 "coming soon"; + add_header Content-Type text/plain; +} diff --git a/services/gitea/docker-compose.yml b/services/gitea/docker-compose.yml new file mode 100644 index 0000000..e3aff40 --- /dev/null +++ b/services/gitea/docker-compose.yml @@ -0,0 +1,17 @@ +services: + server: + image: gitea/gitea:latest + container_name: gitea + environment: + - USER_UID=1000 + - USER_GID=1000 + - GITEA__server__ROOT_URL=https://gitea.zidanesyukri.me/ + - GITEA__server__DOMAIN=gitea.zidanesyukri.me + restart: always + volumes: + - ./data:/data + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + ports: + - "3000:3000" + - "222:22" diff --git a/services/n8n/docker-compose.yml b/services/n8n/docker-compose.yml new file mode 100644 index 0000000..4033584 --- /dev/null +++ b/services/n8n/docker-compose.yml @@ -0,0 +1,15 @@ +services: + n8n: + image: docker.n8n.io/n8nio/n8n + container_name: n8n + restart: unless-stopped + ports: + - "5678:5678" + environment: + - N8N_HOST=n8n.zidanesyukri.me + - N8N_PORT=5678 + - N8N_PROTOCOL=https + - NODE_ENV=production + - WEBHOOK_URL=https://n8n.zidanesyukri.me/ + volumes: + - ./data:/home/node/.n8n diff --git a/services/openwebui/docker-compose.yml b/services/openwebui/docker-compose.yml new file mode 100644 index 0000000..7946086 --- /dev/null +++ b/services/openwebui/docker-compose.yml @@ -0,0 +1,12 @@ +services: + open-webui: + image: ghcr.io/open-webui/open-webui:main + container_name: open-webui + restart: unless-stopped + ports: + - "8080:8080" + environment: + - WEBUI_URL=https://ai.zidanesyukri.me + - CORS_ALLOW_ORIGIN=https://ai.zidanesyukri.me + volumes: + - ./data:/app/backend/data