Aggiorna la configurazione di deployment per utilizzare ClusterIP e aggiungi Ingress per la gestione SSL
All checks were successful
GKE Auto-Deploy / build-and-deploy (push) Successful in 36s
All checks were successful
GKE Auto-Deploy / build-and-deploy (push) Successful in 36s
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
@@ -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
|
||||
---
|
||||
# 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
|
||||
@@ -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.
|
||||
@@ -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 /
|
||||
@@ -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 ""
|
||||
@@ -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`
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user