Modulo 1 (4h) — VM, Linux, Git
Introduzione DevOps (30’)
- Che cos’è DevOps, cicli CI/CD, infrastruttura come codice, osservabilità.
- Mappa dei prerequisiti e percorso del corso. Output atteso del progetto finale.
VirtualBox e Vagrant (75’)
- Concetti: VM vs container, snapshot, rete NAT/host-only/bridged.
- Setup: importare box ubuntu, Vagrantfile minimal.
- Esercizio: creare VM con 2 NIC (NAT + host-only), porta 8080 forwardata.
- Troubleshooting tipico: VT-x/SVM disabilitato, conflitti porte, guest additions.
Nozioni di base Linux e CLI (60’)
- Navigazione: ls, cd, pwd, find, grep, less, head/tail, redirezioni e pipe.
- Gestione file: cp, mv, rm, chmod/chown, tar, rsync.
- Processi e servizi: ps, top/htop, systemctl.
- Editor vi/vim: modalità, salvataggio, ricerca, multi-line edit.
- Esercizio: scrivere un piccolo script bash che verifica servizi attivi e logga su /var/log/local/.
Gestione pacchetti e servizi (20’)
- apt update/upgrade/install, systemctl enable/start/status/logs con journalctl.
- Esercizio: installare curl, git, python3-pip.
Git e GitHub (35’)
- git init/clone/add/commit/branch/merge/rebase/bisect basics, remote, PR.
- Esercizio: fork del repo del corso, creare branch “feature/setup”, aprire PR sul mirror didattico.
Modulo 2 (4h) — Networking, Web server, TLS
Networking Fundamentals (60’)
- IP, subnet, gateway, DNS, /etc/hosts, ping, traceroute, nslookup/dig, ss/netstat.
- Porte e protocolli (TCP/UDP), firewall ufw.
- Esercizio: configurare NIC host-only su 192.168.56.0/24, verificare con ip addr; abilitare porta 8080 con ufw.
Apache HTTPD e NGINX overview (30’)
- Scelte d’uso, statico vs reverse proxy.
- Esercizio rapido: installare nginx, servire una pagina statica su 8080, log access/error.
Apache Tomcat (30’)
- Concetti Java servlet/JSP, war, connettori.
- Demo: avvio Tomcat, deploy war di esempio (hello.war). Nota sui conflitti di porta 8080.
SSL/TLS Basics (40’)
- Certificati, catena, chiavi, CSR, self-signed vs CA.
- Esercizio: generare self-signed con openssl, configurare NGINX per HTTPS su 8443, test con curl -k e browser.
JSON, YAML, JSONPath (40’)
- Sintassi, differenze, insidie (indentazione YAML).
- Strumenti: jq yq.
- Esercizio: estrarre campi da una risposta JSON con jq; convertire YAML⇄JSON con yq.
Checkpoint quiz/retro (10’)
Modulo 3 (4h) — Applicazioni e Database
Opzione Python (consigliata per rapidità)
Python e PIP (45’)
- venv, pip install, requirements.txt, gestione versioni.
- Esercizio: creare venv, installare Flask, requests, psycopg2-binary.
App Flask (60’)
- App minimal con due endpoint: /health e /users (GET).
- Config via YAML/JSON (porta, DB URL). Logging su stdout e file.
- Esercizio: implementare /health che verifica connessione DB, e /users che legge utenti.
PostgreSQL (60’)
- Installazione e avvio, utenti/ruoli, database, schema semplice.
- Esercizio: creare DB devops, tabella users(id, name), seed iniziale. Connessione da Flask.
MongoDB (opzionale 30’)
- Installazione, concetto di documenti/collection.
- Esercizio breve: salvare un documento e leggerlo. Confronto SQL vs NoSQL.
Java Build & Packaging (opzione alternativa 45’)
- JDK 17, Maven/Gradle, packaging jar/war, struttura progetto.
- Esercizio: app Spring Boot “hello” con actuator /health, configurazione YAML.
Modulo 4 (4h) — Integrazione end‑to‑end e progetto finale
Integrazione con web server (45’)
- NGINX reverse proxy verso Flask su 5000 (o Spring Boot su 8081).
- Esercizio: configurare server block, upstream, headers, timeouts, log separati. Verifica con curl.
Sicurezza di base (30’)
- Least privilege, ssh hardening, ufw, aggiornamenti, permessi file chiave/tls, variabili d’ambiente per segreti.
- Esercizio: creare utente app, systemd unit per l’app con EnvironmentFile.
Service management e logging (30’)
- systemd unit per l’app: restart on-failure, working directory, ExecStart.
- Esercizio: file .service, abilitare all’avvio, visualizzare log con journalctl -u.
DNS pratico e troubleshooting (25’)
- /etc/hosts per dominio locale (es. app.local), dig, curl con Host header.
- Esercizio: mappare app.local a IP host-only e testare HTTPS con certificato self-signed.
Verifica DB e migrazioni leggere (20’)
- Script SQL idempotenti, check di schema version (manuale).
- Esercizio: aggiungere colonna email a users, migrare seed, aggiornare app.
Progetto finale e consegna (90’)
- Obiettivo: consegnare una VM Vagrant che, con vagrant up, provvede:
- NGINX reverse proxy su 443 (self-signed) → app Python/Java.
- App esposta con /health e /users.
- PostgreSQL con tabella users e seed.
- Config in YAML/JSON; systemd unit per l’app; ufw configurato.
- Deliverable:
- Repository Git con: Vagrantfile, provisioning script (bash o Ansible local), sorgenti app, file di config, unit systemd, README con istruzioni, diagramma architetturale semplice.
- Criteri di valutazione (vedi sotto).
Criteri di valutazione
-
Funziona con vagrant up (automatizzazione provisioning): 30%
-
Qualità del repository (struttura, README, commit chiari, .gitignore): 20%
-
App: endpoint /health e /users funzionanti, logging, configurazioni esterne: 20%
-
Integrazione: NGINX reverse proxy, TLS self-signed, ufw coerente: 15%
-
DB: schema creato, seed e query corretta: 10%
-
Troubleshooting documentato (FAQ nel README): 5%