Architettura di Deployment: Sistema di Produzione a Zero Tempi Morti

Questo articolo spiega come distribuiamo e gestiamo il sito web con riavvii automatici e zero tempi morti.

Il Problema: Il Deployment Manuale è Rischioso

Il deployment tradizionale richiede:

  • Riavvio manuale del server: Causa tempi morti

  • Monitoraggio del servizio: Qualcuno deve vigilare sui crash

  • Aggiornamenti del codice: Richiede accesso SSH e passaggi manuali

  • Rollback: Processo manuale se qualcosa si rompe

Questo non scala e causa tempi morti durante gli aggiornamenti.

La Soluzione: Deployment Automatizzato con Systemd

Utilizziamo systemd per gestire (vedi Panoramica dell'Infrastruttura) l'applicazione:

  • Riavvio automatico: Si riavvia automaticamente in caso di crash o modifica del codice

  • Zero tempi morti: Riavvio graduale dei worker

  • Logging: Gestione centralizzata dei log

  • Gestione dei processi: Gestisce il ciclo di vita dei worker

Infrastruttura del Server

Server di Produzione

Il server di produzione ospita il sito web pubblico:

  • Scopo: Sito web pubblico che serve il catalogo prodotti e l'e-commerce

  • Modulo: Solo "web"

  • Ambiente: Produzione (Gunicorn + systemd)

  • Accesso: Pubblico (nessun login richiesto)

Server Applicativo

Gunicorn

Gunicorn è il server web di produzione:

  • Multi-worker: Processi worker multipli

Integrazione con Systemd

Systemd gestisce Gunicorn:

  • Avvio automatico: All'avvio del server

  • Riavvio automatico: In caso di crash o modifica del codice

  • Logging: Integrazione con il journal di systemd

  • Gestione dei processi: Ciclo di vita dei worker

Configurazione

Configurazione dell'Ambiente

La configurazione è specifica per l'ambiente:

  • File di configurazione: Impostazioni specifiche per l'ambiente

  • Formato JSON: Coppie chiave-valore

  • Variabili d'ambiente: Segreti e chiavi API

  • Abilitazione moduli: Controlla quali funzionalità vengono caricate

Asset Statici

Gli asset statici sono serviti da S3 con CloudFront CDN:

  • Bucket S3: Archiviazione oggetti per file statici

  • CloudFront: CDN per la distribuzione globale degli asset

  • Caching: TTL lungo per i contenuti statici

  • Versioning: Invalida della cache con numeri di versione

Processo di Deployment

Deployment del Codice

Il codice viene distribuito via Git con systemd che gestisce il servizio applicativo:

  1. Commit e push: Le modifiche vengono inviate al repository Git
  2. Pull sul server: Il codice viene scaricato sul server di produzione
  3. Riavvio di Systemd: Il servizio si riavvia automaticamente in caso di crash

Deployment della Configurazione

La configurazione è gestita separatamente dal codice:

  1. File di configurazione: File di configurazione JSON in Git
  2. Variabili d'ambiente: Segreti caricati dall'ambiente
  3. Abilitazione moduli: Controlla quali funzionalità vengono caricate

Monitoraggio

Controlli di Salute

Gli endpoint di salute monitorano lo stato del server:

  • Endpoint di salute: Controllo di salute di base

  • Controllo database: Connettività al database

  • Controllo cache: Connettività alla cache

Logging

I log sono memorizzati in più posizioni:

  • Log di errore di Gunicorn: Errori dell'applicazione

  • Log di accesso di Gunicorn: Richieste HTTP

  • Log del servizio: Journal di systemd

Riepilogo

L'architettura di deployment fornisce:

  • Gunicorn: Server WSGI di produzione

  • Systemd: Riavvio automatico e gestione dei processi

  • Deployment Git: Gestione di codice e configurazione

  • S3 + CloudFront: Distribuzione di asset statici

  • Monitoraggio della salute: Endpoint di controllo della salute

  • Logging: Log di errore e di accesso