From 32314842a49e63a7f8eed8d47565a2852664f2bf Mon Sep 17 00:00:00 2001 From: Carmine Savino Date: Wed, 28 Jan 2026 21:44:19 +0100 Subject: [PATCH] Aggiorna la configurazione di deployment per utilizzare ClusterIP e aggiungi Ingress per la gestione SSL --- .gitea/workflows/main.yml | 2 - TROUBLESHOOTING.md | 238 -------------------------- k8s/deployment.yaml | 33 +++- maintenance-scripts/README.md | 66 ------- maintenance-scripts/cleanup-docker.sh | 34 ---- quick-debug.sh | 24 --- traefik-example/README.md | 68 -------- traefik-example/docker-compose.yml | 66 ------- 8 files changed, 31 insertions(+), 500 deletions(-) delete mode 100644 TROUBLESHOOTING.md delete mode 100644 maintenance-scripts/README.md delete mode 100644 maintenance-scripts/cleanup-docker.sh delete mode 100644 quick-debug.sh delete mode 100644 traefik-example/README.md delete mode 100644 traefik-example/docker-compose.yml diff --git a/.gitea/workflows/main.yml b/.gitea/workflows/main.yml index 741a764..166397e 100644 --- a/.gitea/workflows/main.yml +++ b/.gitea/workflows/main.yml @@ -48,8 +48,6 @@ jobs: # --- PARTE NUOVA: TEMPLATING E APPLY --- - name: Deploy to GKE run: | - echo "Ecco i file presenti nella cartella:" - ls -R gcloud container clusters get-credentials ${{ env.CLUSTER_NAME }} --zone ${{ env.CLUSTER_ZONE }} # 1. Installiamo envsubst (se non c'è già nell'immagine, di solito c'è ma per sicurezza) diff --git a/TROUBLESHOOTING.md b/TROUBLESHOOTING.md deleted file mode 100644 index ad0f68b..0000000 --- a/TROUBLESHOOTING.md +++ /dev/null @@ -1,238 +0,0 @@ -# Troubleshooting 404 Error - -Se ottieni un errore 404 visitando il sito, segui questi passaggi: - -## 1. Esegui lo Script di Debug - -Sul server, nella directory del progetto: - -```bash -chmod +x debug-server.sh -./debug-server.sh -``` - -Questo script ti mostrerà: -- Stato del container -- Logs -- File presenti in nginx -- Configurazione rete -- Labels Traefik - -## 2. Problemi Comuni e Soluzioni - -### ❌ Container non in esecuzione - -**Verifica:** -```bash -docker ps -a | grep vue-demo-app -``` - -**Soluzione:** -```bash -docker-compose up -d -``` - -### ❌ File mancanti in /usr/share/nginx/html/ - -**Verifica:** -```bash -docker exec vue-demo-app ls -la /usr/share/nginx/html/ -``` - -**Dovrebbe mostrare:** -- index.html -- assets/ (directory) - -**Soluzione se i file mancano:** -```bash -# Rebuild completo -docker-compose down -docker-compose build --no-cache -docker-compose up -d -``` - -### ❌ Rete web_proxy non esiste - -**Verifica:** -```bash -docker network ls | grep web_proxy -``` - -**Soluzione:** -```bash -docker network create web_proxy -docker-compose restart -``` - -### ❌ Container non sulla rete corretta - -**Verifica:** -```bash -docker inspect vue-demo-app --format='{{range $key, $value := .NetworkSettings.Networks}}{{$key}}{{"\n"}}{{end}}' -``` - -**Soluzione:** -```bash -docker network connect web_proxy vue-demo-app -docker-compose restart -``` - -### ❌ Variabile DOMAIN non configurata - -**Verifica:** -```bash -cat .env -``` - -**Soluzione:** -```bash -echo "DOMAIN=tuo-dominio.com" > .env -docker-compose down -docker-compose up -d -``` - -### ❌ Traefik non trova il container - -**Verifica labels:** -```bash -docker inspect vue-demo-app | grep -A 20 Labels -``` - -**Verifica logs Traefik:** -```bash -docker logs traefik | grep vue-demo -``` - -**Possibili problemi:** -1. Dominio nel .env non corrisponde al DNS -2. Traefik non è sulla stessa rete del container -3. Labels Traefik non corretti - -**Soluzione:** -```bash -# Ricrea container con labels corretti -docker-compose down -docker-compose up -d - -# Verifica che entrambi siano sulla rete web_proxy -docker network inspect web_proxy -``` - -### ❌ Nginx restituisce 404 - -**Test diretto:** -```bash -# Ottieni IP del container -CONTAINER_IP=$(docker inspect vue-demo-app --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}') - -# Test diretto (dall'interno del server) -curl http://$CONTAINER_IP -``` - -**Se questo funziona ma il dominio no, il problema è Traefik.** -**Se anche questo restituisce 404, il problema è nginx/build.** - -**Soluzione problemi nginx:** -```bash -# Verifica file -docker exec vue-demo-app cat /usr/share/nginx/html/index.html - -# Verifica configurazione nginx -docker exec vue-demo-app nginx -t - -# Rebuild se necessario -docker-compose build --no-cache -docker-compose up -d -``` - -## 3. Verifica Configurazione Traefik - -Assicurati che Traefik sia configurato correttamente: - -### Verifica entrypoints: -```bash -docker inspect traefik | grep -i entrypoint -``` - -Dovrebbe avere: -- `web` su porta 80 -- `websecure` su porta 443 - -### Verifica cert resolver: -```bash -docker inspect traefik | grep -i letsencrypt -``` - -Dovrebbe avere il resolver `letsencrypt` configurato. - -### Verifica rete: -```bash -docker network inspect web_proxy -``` - -Traefik e vue-demo-app devono essere entrambi su questa rete. - -## 4. Test Manuale Completo - -```bash -# 1. Verifica DNS -nslookup tuo-dominio.com - -# 2. Verifica rete -docker network inspect web_proxy - -# 3. Verifica container -docker ps | grep vue-demo - -# 4. Test interno -docker exec vue-demo-app wget -O - http://localhost - -# 5. Verifica logs -docker logs vue-demo-app -docker logs traefik | grep vue-demo - -# 6. Test dal server -curl -H "Host: tuo-dominio.com" http://localhost - -# 7. Test esterno -curl https://tuo-dominio.com -``` - -## 5. Rebuild Completo (Last Resort) - -Se nulla funziona: - -```bash -# Stop tutto -docker-compose down - -# Rimuovi immagini vecchie -docker rmi vue-demo:latest -docker system prune -f - -# Verifica .env -cat .env - -# Rebuild completo -docker-compose build --no-cache - -# Verifica rete -docker network ls | grep web_proxy || docker network create web_proxy - -# Avvia -docker-compose up -d - -# Controlla logs -docker-compose logs -f -``` - -## 6. Contatta Supporto - -Se dopo tutti questi passaggi il problema persiste, raccogli le seguenti informazioni: - -```bash -./debug-server.sh > debug-output.txt -docker-compose logs > docker-logs.txt -``` - -E invia i file di output per ulteriore analisi. diff --git a/k8s/deployment.yaml b/k8s/deployment.yaml index 4cf1c61..2e6a08d 100644 --- a/k8s/deployment.yaml +++ b/k8s/deployment.yaml @@ -20,14 +20,43 @@ spec: ports: - containerPort: 80 --- +# NOTA: Il servizio ora è ClusterIP (interno), non più LoadBalancer. +# Non costa nulla e non ha IP pubblico diretto. apiVersion: v1 kind: Service metadata: name: ${APP_NAME}-service spec: - type: LoadBalancer + type: ClusterIP selector: app: ${APP_NAME} ports: - port: 80 - targetPort: 80 \ No newline at end of file + targetPort: 80 +--- +# LA PARTE NUOVA: INGRESS +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: ${APP_NAME}-ingress + annotations: + # Queste due righe attivano la magia SSL automatica + cert-manager.io/cluster-issuer: "letsencrypt-prod" + kubernetes.io/tls-acme: "true" +spec: + ingressClassName: nginx + tls: + - hosts: + - ${APP_NAME}.demo.bytebuilder.it + secretName: ${APP_NAME}-tls + rules: + - host: ${APP_NAME}.demo.bytebuilder.it + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: ${APP_NAME}-service + port: + number: 80 \ No newline at end of file diff --git a/maintenance-scripts/README.md b/maintenance-scripts/README.md deleted file mode 100644 index 4ecf73a..0000000 --- a/maintenance-scripts/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# Script di Manutenzione - -Script utili per la gestione e manutenzione del server. - -## cleanup-docker.sh - -Script per liberare spazio Docker rimuovendo: -- Container fermati -- Immagini non utilizzate -- Volumi orfani -- Network non utilizzati - -### Utilizzo - -```bash -# Rendi eseguibile -chmod +x cleanup-docker.sh - -# Esegui manualmente -./cleanup-docker.sh -``` - -### Automazione con Cron - -Per eseguire la pulizia automaticamente ogni settimana: - -```bash -# Apri crontab -crontab -e - -# Aggiungi questa riga per eseguire ogni domenica alle 3:00 -0 3 * * 0 /opt/vue-demo/cleanup-docker.sh >> /var/log/docker-cleanup.log 2>&1 -``` - -## Monitoraggio Spazio - -### Verifica spazio disco -```bash -df -h -``` - -### Verifica spazio Docker -```bash -docker system df -docker system df -v # output dettagliato -``` - -### Analizza dimensioni immagini -```bash -docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" -``` - -### Trova container più grandi -```bash -docker ps -s -``` - -## Limiti Raccomandati - -Con 8GB di spazio totale: -- Sistema operativo: ~2-3GB -- Docker + Traefik: ~500MB -- Applicazioni: ~2-3GB -- Spazio libero buffer: ~2GB minimo - -**Alert**: Se lo spazio libero scende sotto 1GB, esegui subito la pulizia Docker. diff --git a/maintenance-scripts/cleanup-docker.sh b/maintenance-scripts/cleanup-docker.sh deleted file mode 100644 index daa122b..0000000 --- a/maintenance-scripts/cleanup-docker.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash - -# Script di manutenzione per liberare spazio Docker -# Esegui periodicamente per mantenere pulito il server - -echo "=== Docker Space Cleanup ===" -echo "" - -echo "Spazio prima della pulizia:" -docker system df - -echo "" -echo "Rimuovo container fermati..." -docker container prune -f - -echo "" -echo "Rimuovo immagini non utilizzate..." -docker image prune -a -f - -echo "" -echo "Rimuovo volumi non utilizzati..." -docker volume prune -f - -echo "" -echo "Rimuovo network non utilizzati..." -docker network prune -f - -echo "" -echo "Spazio dopo la pulizia:" -docker system df - -echo "" -echo "Spazio disco totale:" -df -h / diff --git a/quick-debug.sh b/quick-debug.sh deleted file mode 100644 index f2fce6a..0000000 --- a/quick-debug.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -echo "=== QUICK DEBUG ===" -echo "" - -echo "1. Logs del container:" -docker logs vue-demo-app --tail 50 -echo "" - -echo "2. Processi in esecuzione nel container:" -docker exec vue-demo-app ps aux -echo "" - -echo "3. File presenti in nginx:" -docker exec vue-demo-app ls -la /usr/share/nginx/html/ -echo "" - -echo "4. Porta 80 in ascolto?" -docker exec vue-demo-app netstat -tlnp 2>/dev/null || docker exec vue-demo-app ss -tlnp 2>/dev/null || echo "netstat/ss non disponibile" -echo "" - -echo "5. Test configurazione nginx:" -docker exec vue-demo-app nginx -t -echo "" diff --git a/traefik-example/README.md b/traefik-example/README.md deleted file mode 100644 index 0fdad5a..0000000 --- a/traefik-example/README.md +++ /dev/null @@ -1,68 +0,0 @@ -# Esempio Configurazione Traefik - -Questa directory contiene un esempio di configurazione Traefik per il server di produzione. - -## Setup Iniziale - -1. Crea la directory sul server: -```bash -mkdir -p /opt/traefik/letsencrypt -cd /opt/traefik -``` - -2. Copia il file docker-compose.yml in questa directory - -3. Modifica l'email per Let's Encrypt: -```bash -nano docker-compose.yml -# Modifica: tua-email@example.com -``` - -4. Crea la rete Docker: -```bash -docker network create traefik-network -``` - -5. Avvia Traefik: -```bash -docker-compose up -d -``` - -6. Verifica che sia attivo: -```bash -docker ps -docker logs traefik -``` - -## Note di Sicurezza - -- **Dashboard**: La configurazione include il dashboard Traefik con autenticazione basic -- Per generare una nuova password per il dashboard: - ```bash - # Installa htpasswd se necessario: apt-get install apache2-utils - htpasswd -nb admin tuapassword - ``` -- In produzione, considera di rimuovere completamente il dashboard o limitarlo a IP specifici - -## Configurazione Domini - -Dopo aver avviato Traefik, i tuoi container con le labels corrette saranno automaticamente esposti con: -- Certificati SSL Let's Encrypt -- Redirect automatico HTTP → HTTPS -- Routing basato sul dominio - -## Troubleshooting - -### Certificati non vengono generati -- Verifica che la porta 80 sia accessibile pubblicamente -- Controlla i logs: `docker logs traefik` -- Verifica che il dominio punti all'IP del server -- Assicurati che il file `acme.json` abbia i permessi corretti: - ```bash - chmod 600 letsencrypt/acme.json - ``` - -### Container non raggiungibili -- Verifica che il container sia sulla rete `traefik-network` -- Controlla i logs di Traefik per errori -- Verifica le labels del container con: `docker inspect nome-container` diff --git a/traefik-example/docker-compose.yml b/traefik-example/docker-compose.yml deleted file mode 100644 index 466c2d0..0000000 --- a/traefik-example/docker-compose.yml +++ /dev/null @@ -1,66 +0,0 @@ -# Esempio di configurazione Traefik -# Da usare come riferimento per configurare Traefik sul server di produzione - -version: '3.8' - -services: - traefik: - image: traefik:v2.10 - container_name: traefik - restart: unless-stopped - security_opt: - - no-new-privileges:true - command: - # Dashboard - - "--api.dashboard=true" - - # Provider Docker - - "--providers.docker=true" - - "--providers.docker.exposedbydefault=false" - - "--providers.docker.network=traefik-network" - - # Entrypoints - - "--entrypoints.web.address=:80" - - "--entrypoints.websecure.address=:443" - - # Redirect HTTP to HTTPS - - "--entrypoints.web.http.redirections.entryPoint.to=websecure" - - "--entrypoints.web.http.redirections.entryPoint.scheme=https" - - # Let's Encrypt - - "--certificatesresolvers.letsencrypt.acme.email=tua-email@example.com" - - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" - - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true" - - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" - - # Logs - - "--log.level=INFO" - - "--accesslog=true" - - ports: - - "80:80" - - "443:443" - - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - - ./letsencrypt:/letsencrypt - - networks: - - traefik-network - - labels: - # Dashboard (opzionale, rimuovi in produzione se non necessario) - - "traefik.enable=true" - - "traefik.http.routers.dashboard.rule=Host(`traefik.tuodominio.com`)" - - "traefik.http.routers.dashboard.entrypoints=websecure" - - "traefik.http.routers.dashboard.tls=true" - - "traefik.http.routers.dashboard.tls.certresolver=letsencrypt" - - "traefik.http.routers.dashboard.service=api@internal" - # Autenticazione basic per dashboard - # Username: admin, Password: changeme (genera il tuo con: htpasswd -nb admin password) - - "traefik.http.routers.dashboard.middlewares=dashboard-auth" - - "traefik.http.middlewares.dashboard-auth.basicauth.users=admin:$$apr1$$8EVjn/nj$$GiLUZqcbueTFeD23SuB6x0" - -networks: - traefik-network: - external: true