Stato avanzamento del progetto Nextcloud su Oracle Cloud Infrastructure.
Ultimo aggiornamento: Marzo 2025
- Creazione istanza OCI A1.Flex (4 vCPU, 24GB RAM, 100GB storage)
- Configurazione Security Lists OCI (porte 22, 80, 443, 8080)
- Setup SSH con chiavi e script di connessione
- Configurazione dominio personalizzato (migrato da DuckDNS a dominio custom)
- Update sistema Ubuntu 24.04 LTS
- Installazione pacchetti essenziali
- Configurazione UFW firewall
- Setup Fail2ban per protezione SSH
- Configurazione unattended-upgrades
- Installazione Docker Engine + Docker Compose
- Configurazione user non-root per Docker
- Setup Caddy reverse proxy
- Configurazione Let's Encrypt SSL automatico
- Deploy Nextcloud AIO con tutti i servizi
- Installazione Nextcloud Hub 25 Autumn
- Configurazione componenti opzionali:
- Collabora Online (Office editing)
- Imaginary (image processing)
- Notify Push (performance)
-
Talk(rimosso - non necessario) -
Whiteboard(rimosso - non necessario)
- Creazione utente admin personalizzato
- Import contatti (rubrica.vcf)
- Import calendari (10 calendari .ics)
- Import tasks/attività
- Documentazione completa step-by-step (6 guide)
- README professionale con architettura
- Script di deployment e utility
- Repository pubblicato su GitHub
- Eliminazione account admin default
- Verifica completa configurazione sicurezza
- Test SSL/TLS headers (HSTS, X-Frame-Options, X-Content-Type-Options)
- Audit firewall rules (UFW + OCI Security Lists)
- Check Fail2ban logs (5 IP bannati, 492 tentativi bloccati)
- Configurazione 2FA (TOTP)
- Setup App Passwords per dispositivi
- Verifica backup automatici abilitati (Borg daily 04:00 UTC)
- Test backup manuale (primo backup 2.6MB)
- Script download backup locale (
download-backup.sh) - Script export dati leggibili (
export-data.sh- calendari .ics, contatti .vcf) - Script backup settimanale automatico (
weekly-backup.sh) - Setup cron automation (
setup-cron.sh- domenica 22:00) ✅ CONFIGURATO - Cron job attivo (verifica:
crontab -l) - Documentazione procedura disaster recovery (
docs/06-BACKUP-RESTORE.md) - Test restore completo da backup - Opzionale
- Test disaster recovery completo - Opzionale
- Test sincronizzazione dispositivi (iPad, iPhone) - Pianificato domani
- Test desktop client (Fedora) - In corso
- Verifica consumo risorse: ~1GB RAM di 24GB (ottimizzato!)
- Test funzionalità core (Calendar, Contacts, Files)
- Test app Collabora/Office
- Guida backup & restore completa (
docs/06-BACKUP-RESTORE.md) - Scripts documentation (
scripts/README.md) - Troubleshooting guide integrata
- README principale aggiornato con backup strategy
- Setup Terraform OCI provider (
terraform/provider.tf) - Configurazione variabili (
terraform/variables.tf) - Modulo creazione VCN e networking (
terraform/network.tf)- VCN, Internet Gateway, Route Table
- Public Subnet
- Security Lists (SSH, HTTP, HTTPS, 8080, 8443)
- Modulo creazione compute instance (
terraform/compute.tf)- Ubuntu 24.04 ARM (A1.Flex)
- Cloud-init bootstrap script
- Configurazione shape (4 OCPU, 24GB RAM)
- Modulo storage con persistent volume (
terraform/storage.tf)- Block Volume separato (150GB per backup Borg)
-
prevent_destroy = trueper protezione backup - Volume attachment automatico
- Architettura corretta: Persistent volume SOLO per backup, dati in volumi Docker standard
- Output e informazioni (
terraform/outputs.tf)- Instance info, IPs, URLs
- SSH command, cost estimate
- Cloud-init automation completa (
terraform/cloud-init.yaml)- Docker installation
- Persistent storage mount per backup
- UFW + Fail2ban setup
- DNS configuration
- Nextcloud AIO + Caddy auto-deploy
- GitHub repository auto-clone - Configuration sempre aggiornata
- Monitoring stack auto-deploy (Prometheus + Grafana + Exporters)
- Multi-environment setup (
test.tfvars,prod.tfvars) - Testing completo su TEST environment
- Deploy e test su PROD environment
- Validazione destroy/apply cycle - Backup persistenti ✅
- Test disaster recovery completo (3 cicli destroy/apply testati)
- DNS propagation verificata
- SSL certificate renewal testato (Let's Encrypt staging)
- Data persistence confermata (block volume protected)
- Documentazione Terraform (
terraform/README.md,docs/08-TERRAFORM-STRATEGY.md)- Disaster Recovery procedures documentate
- Workflow operativi (git pull vs destroy/apply)
- Troubleshooting completo (SSL rate limit, DNS, cloud-init)
- Automatizzazione installazione Docker - FATTO via
cloud-init.yaml - Automatizzazione deploy Nextcloud stack - FATTO via
cloud-init.yaml - Automatizzazione firewall + security - FATTO (UFW + Fail2ban via cloud-init)
- Automatizzazione DNS update - FATTO via cloud-init
- Ansible playbook per system setup - Non necessario (cloud-init è sufficiente)
- Idempotency testing - Opzionale
- GitHub Actions workflow per Terraform (
ci.yml)- Staged pipeline con 5 stage sequenziali
- Fast feedback (< 5 min per PR)
- Parallelizzazione intelligente (security + docker in parallelo)
- Terraform validation su PR
- Format check (
terraform fmt) - Init + Validate
- tfsec security scanning
- Trivy IaC vulnerability scanning
- Format check (
- Terraform apply su merge - Non implementato by design (deploy manuale)
- Automated testing completo
- YAML linting (yamllint)
- Docker Compose validation
- Markdown linting (markdownlint-cli2)
- Shell script linting (shellcheck)
- Secret detection (gitleaks)
- Custom security checks (privileged containers, socket permissions)
- Pre-commit hooks (
.pre-commit-config.yaml)- Setup script (
scripts/setup-precommit.sh) - Auto-format Terraform, Markdown
- Auto-lint YAML, Shell scripts
- Secret detection locale
- Setup script (
- Scheduled security scans
- Deep security scan (weekly Monday 9:00 UTC)
- Docker image vulnerability scan (weekly Wednesday 3:00 UTC)
- SARIF upload to GitHub Security tab
- PR automation
- Auto-labeling by file paths
- Size labeling (XS/S/M/L/XL)
- Conventional commits validation (informational)
- Branch protection rules documented
- Documentation CI/CD (
docs/09-CICD-MONITORING.md)- Pipeline architecture diagrams
- Workflow structure explanation
- Troubleshooting guide
- Best practices
- Komga - Manga/comics reader integrato con file Nextcloud
- Lettura diretta dalla libreria Nextcloud (read-only mount)
- Accesso sicuro via Tailscale Serve (HTTPS)
- Compatibile con app mobile (Yokai su Android/e-ink)
- Jellyfin - Media server per video
- Streaming video dalla libreria Nextcloud (read-only mount)
- Accesso sicuro via Tailscale Serve (HTTPS)
- Migrazione da DuckDNS a dominio personalizzato
- Tailscale Serve per servizi privati (Komga, Jellyfin, Grafana)
- Servizi bound a localhost only (127.0.0.1)
- HTTPS automatico via Tailscale Serve
- Nessun sottodominio pubblico necessario
- Caddy gestisce solo Nextcloud (unico servizio pubblico)
- Valutate e scartate alternative: basicauth (loop login), IP filtering in Docker (bridge IP issue), accesso diretto Tailscale IP (no SSL)
- Prometheus setup per metriche (
docker/monitoring/prometheus.yml)- 30 giorni retention
- Scrape interval 15s
- Job configuration per tutti i servizi
- Grafana dashboard (
docker/docker-compose.yml)- Auto-provisioned Prometheus datasource
- SSL reverse proxy via Caddy (monitoring.your-domain.example.com)
- Password protection configurata
- Node Exporter - System metrics
- CPU, RAM, disk, network
- Filesystem monitoring
- System load metrics
- cAdvisor - Docker container metrics
- Container resource usage
- Per-container CPU/memory/network
- Docker events tracking
- Caddy metrics endpoint (
:2019/metrics)- HTTP request metrics
- SSL certificate expiry
- Response times
- Monitoring network isolation - Secure by default
- Prometheus, Grafana, exporters su rete
monitoring - Localhost-only bindings (solo Grafana esposta via HTTPS)
- Prometheus, Grafana, exporters su rete
- Auto-deployment via cloud-init - Monitoring sempre presente
- Grafana accessibile via Tailscale Serve (
https://tailscale-hostname:3000) - Import dashboard ID 179 (Docker Container & Host Metrics)
- Import dashboard ID 11074 (Node Exporter Full)
- Custom dashboard per Nextcloud-specific metrics
- Dashboard per Caddy reverse proxy metrics
- Alert manager configuration
- Critical alerts:
- Disk space < 20%
- Memory usage > 90%
- Container down/restarting
- SSL certificate expiry < 7 days
- Notification channels (email, webhook)
- Log aggregation (Loki + Promtail)
- Distributed tracing (opzionale)
- Application Performance Monitoring
- Multi-region backup strategy
- Database replication (futuro)
- Load balancing considerations
- CDN integration (opzionale)
- Vaultwarden (password manager)
- Portainer (Docker GUI management)
- Uptime Kuma (uptime monitoring)
- Watchtower (auto-updates container)
- Intrusion detection (OSSEC/Wazuh)
- Web Application Firewall
- Regular security audits
- Penetration testing
- Nextcloud accessibile e funzionante
- SSL/HTTPS configurato
- Dati migrati correttamente
- Backup funzionanti
- Security hardening completo
- Backup testati e funzionanti (dual system: Borg + exports)
- Documentazione completa
- Monitoring base attivo - Prometheus + Grafana deployati
- Terraform struttura completa (IaC pattern production-grade)
- Terraform testato su deployment reale (test + prod environments)
- CI/CD pipeline attiva (GitHub Actions con 3 workflows)
- Monitoring stack deployato - Prometheus + Grafana + Exporters
- Disaster Recovery testato - 3 cicli destroy/apply completati
- Monitoring dashboards configurati - In corso
- Demo/screenshots - Opzionale
- HA setup
- Disaster recovery testato - Funzionante (3 test cycles)
- Monitoring completo con alerting e dashboards
- Security audit completato
- ✅ Monitoring stack deployato - Prometheus + Grafana + Node Exporter + cAdvisor
- ✅ Cloud-init con GitHub clone - Configuration auto-update da repo
- ✅ Disaster recovery testato - 3 cicli destroy/apply completati con successo
- ✅ Documentazione workflow operativi - git pull vs destroy/apply
- ✅ SSL production certificates - Let's Encrypt production attivi
- ✅ Grafana password configurata - Login protetto
- ✅ Komga + Jellyfin - Media services con accesso Tailscale Serve
- ✅ Migrazione DuckDNS → dominio personalizzato
- ✅ README aggiornato - Documentazione completa per portfolio
-
Monitoring Alerting
- Configurare Alertmanager
- Alert critici (disk space, memory, containers down)
- Notification channels (email/webhook)
-
Portfolio Finalization
- Screenshot monitoring dashboards
- Blog post/writeup (opzionale)
Accesso Servizi Privati (via Tailscale Serve):
- Komga:
https://tailscale-hostname:25600 - Jellyfin:
https://tailscale-hostname:8096 - Grafana:
https://tailscale-hostname:3000 - Prometheus:
http://localhost:9090(SSH tunnel:ssh -L 9090:localhost:9090 ubuntu@IP)
- Caddy vs Nginx/Traefik: Scelto Caddy per SSL automatico e semplicità
- AIO vs Manual Setup: AIO per gestione semplificata e best practices integrate
- PostgreSQL vs MySQL: PostgreSQL incluso in AIO, migliori performance
- Dominio personalizzato: Flessibile, professionale, compatibile Let's Encrypt
- Tailscale Serve vs sottodomini pubblici: Servizi privati (Komga, Jellyfin, Grafana) non esposti su internet. Tailscale Serve fornisce HTTPS senza bisogno di DNS pubblici o certificati extra
- BasicAuth scartato: Causa loop di login con Komga e Jellyfin (auth interna in conflitto)
- IP filtering in Docker scartato: Caddy in Docker vede Docker bridge IP, non l'IP Tailscale del client
- Talk: Funzionalità multi-utente non necessaria per uso singolo
- Whiteboard: Collaborazione non necessaria
- ClamAV: Troppo pesante (1GB RAM), antivirus non essenziale
SKIP_DOMAIN_VALIDATION=truecausa problemi → Usare Caddy come reverse proxy- Importare calendario e tasks insieme, non separatamente
- OCI Security Lists devono essere configurate PRIMA del deploy
- Backup testing è critico prima di considerare il sistema production-ready
- Dual backup strategy (Borg + exports) offre disaster recovery completo + portabilità
- Script bash con
set -epossono terminare prematuramente in loop → usareset -uo error handling - curl in while loop consuma stdin → usare array o redirect
< /dev/null
- ❌ ERRORE CRITICO: Configurare Docker
data-rootsul volume persistente causa corruzione degli overlay2 layers al destroy/apply - ✅ ARCHITETTURA CORRETTA: Volume persistente SOLO per backup Borg, Docker volumes in
/var/lib/docker/volumes(su boot volume) - Pattern "Pets vs Cattle": Compute = Cattle (effimero, ricreabile), Data = Pet (persistente, nei backup)
- Nextcloud AIO richiede volumi Docker standard - non modificare posizione con
data-root - Destroy/Apply workflow: Istanza fresh → Setup AIO manuale → Restore da backup Borg
- Questo è by design: disaster recovery richiede restore manuale, ma destroy/apply non dovrebbe essere frequente in production
prevent_destroysul volume dati previene cancellazione accidentale dei backup- Cloud-init può auto-deployare container ma NON può restorare dati (richiede AIO interface)
- Staged Pipeline: Struttura con stage sequenziali (validation → security/docker parallel → summary) offre feedback rapido e chiaro
- Fail Fast: Validation stage prima (< 2 min) evita di eseguire security scan costosi su codice malformato
- SARIF Upload Permissions: Workflow che caricano su GitHub Security tab richiedono
security-events: writepermission - Markdown Linting Exclusions:
.terraform/provider dependencies vanno esclusi con pattern*/\.terraform/*(doppio asterisco per nested paths) - Pre-commit Hooks: Testare localmente prima del commit riduce drasticamente i cicli di feedback CI/CD
- Terraform Security:
tfsectrova security issues che Terraform validate non rileva (es. public IP, security group rules) - Separazione CI/Scheduled: CI workflow con output
tableper feedback immediato, scheduled workflows con SARIF per tracking lungo termine - Testing Locale Prima:
find . -name "*.md" -not -path "*/\.terraform/*" | xargs markdownlint-cli2per evitare commit inutili - Git History Pulita: Testare sempre localmente prima di pushare - commit multipli di fix sporcano la repo
Ultimo aggiornamento: Marzo 2025