Come ho sostituito Google Calendar con Nextcloud self-hosted

Un percorso pratico tra privacy, apprendimento e qualche fallimento istruttivo

Dopo soli 8 giorni dal Linux Day… io non riesco a stare ferma, ho ricevuto troppi input, troppe cose da sperimentare, e nuovi mondi in cui perdersi! (se ti sei perso il mio racconto, puoi recuperarlo qui!)

TL;DR: Ho sostituito Google Calendar con Nextcloud self-hosted gratuito su Oracle Cloud, sincronizzato su GrapheneOS e Mac. 6 ore di setup (inclusi fallimenti istruttivi), ma ora funziona perfettamente. Ecco come, cosa ho sbagliato, e cosa ho imparato.


📢 Aggiornamento: Dopo alcuni giorni di uso, ho migliorato il setup. Leggi gli aggiornamenti qui.

Da anni sono utente Apple e Google. E dopo il Linux Day, ho deciso di mettermi in gioco.

Lato mobile: uso da qualche giorno GrapheneOS, con 3 profili:

  • Principale: no servizi Google, solo app FOSS
  • Secondo: servizi Google per app banca
  • Terzo: qualche app social residua

Lato desktop: aspetto l'arrivo di un ThinkPad super vecchio e super usato per installare Linux!

Il percorso sarà graduale, quindi ho deciso di iniziare da CALENDAR E TASK!

1. L'esigenza: riprendersi il controllo dei propri dati

Dopo aver scelto GrapheneOS per il mio smartphone, mi sono trovata di fronte a un problema apparentemente banale: come sincronizzare calendari e task tra dispositivi senza passare per Google?

La questione non era solo ideologica. Utilizzando GrapheneOS, un sistema operativo Android hardened orientato alla privacy, aveva poco senso continuare a inviare tutti i miei appuntamenti e impegni ai server di Mountain View. Cercavo una soluzione che rispettasse questi requisiti:

  • Privacy by design: dati sotto il mio controllo
  • Sincronizzazione multi-dispositivo: GrapheneOS, Mac, e in futuro Linux
  • App locali native: volevo continuare a usare Fossify Calendar e Tasks.org, non interfacce web
  • Standard aperti: niente ecosistemi proprietari, protocolli CalDAV/CardDAV
  • Costo sostenibile: possibilmente gratuito o molto economico

Il percorso che sto per raccontare non è stato lineare. Ho incontrato errori, container che crashavano, porte occupate e messaggi di "out of capacity" frustranti. Ma proprio questi ostacoli si sono rivelati la parte più formativa dell'esperienza.

La ricerca della soluzione

Prima di sporcarmi le mani con server e Docker, ho esplorato il panorama delle alternative a Google Calendar orientate alla privacy. Ho visto recensioni e video su Proton, ma non mi sento pronta a spostare tutto in un unica nuova suite. Voglio provare a decentralizzare.

Ho esplorato opzioni self-hosted per poter usare CalDAV, e mi sono imbattuta sempre più spesso in un nome Nextcloud. Un piattaforma completa, Non solo calendario e task, ma anche file, note, collaborazione. Molto popolare, community attiva, ben documentato. Contro: può essere pesante in termini di risorse.

Nextcloud per imparare

Ho scelto Nextcloud per tre motivi:

  1. Apprendimento: volevo imparare Docker, reverse proxy, gestione server. Nextcloud offre abbastanza complessità da essere formativo, ma non è impossibile.
  2. Flessibilità: oggi voglio calendario e task, domani potrei aggiungere sincronizzazione file, note, o altri servizi. Nextcloud cresce con me.
  3. Standard aperti: CalDAV puro, nessun vendor lock-in. Se un domani volessi migrare a un altro server, i miei dati restano miei.

Primo tentativo (FALLITO) con Nextcloud All-In-One

Oracle Cloud offre un Free Tier generoso: una VM con 1GB RAM gratis per sempre, più la possibilità (teorica, ho anche provato con uno script ma non sono riuscita ad ottenere la seconda opzione) di ottenere VM ARM con 24GB RAM. Perfetto per iniziare.

Setup iniziale

Ho creato il mio account Oracle Cloud selezionando Frankfurt come region (GDPR-compliant, datacenter vicino). La configurazione iniziale è stata relativamente semplice:

  • VM: Ubuntu 24.04
  • Shape: VM.Standard.E2.1.Micro (1GB RAM, 1 vCPU)
  • Storage: 50GB
  • Network: Virtual Cloud Network con subnet pubblica, IP pubblico assegnato

Ho configurato le Security List per aprire le porte necessarie (22 per SSH, 80 per HTTP, 443 per HTTPS) e mi sono connesso via SSH.

L'idea: Nextcloud All-In-One

Nextcloud AIO (All-In-One) prometteva di essere la soluzione chiavi-in-mano: un container Docker che installa e gestisce automaticamente tutti i componenti necessari (Nextcloud, database PostgreSQL, Redis, Apache, backup, aggiornamenti). Teoricamente, tre comandi e sei operativa.

L'interfaccia web su porta 8080 si è aperta correttamente. Ho configurato il mio dominio DuckDNS (servizio gratuito per avere un nome di dominio che punta al mio IP dinamico), e ho cliccato "Start containers".

Qui iniziano i problemi

Guardando i log con `docker logs nextcloud-aio-mastercontainer`, ho notato che i container si avviavano, consumavano RAM, e crashavano. Nextcloud AIO cerca di avviare contemporaneamente:

  • Mastercontainer
  • Nextcloud (Apache + PHP)
  • PostgreSQL
  • Redis
  • Apache reverse proxy
  • Domaincheck
  • Altri servizi

Su 1GB di RAM, era un'impresa impossibile. Il sistema andava in swap, rallentava, e Docker iniziava a terminare container per liberare memoria. La VM è letteralmente crashata, non rispondeva nemmeno a SSH.

Out of Capacity per VM ARM

Ho pensato: "Facile, passo alla VM ARM gratuita con 24GB RAM!". Mi sono entusiasmata (troppo in fretta): Oracle offre VM Ampere (ARM) con 4 core e 24GB RAM completamente gratuite nel Free Tier. Maaaaaaa.... sì, è un "ma" grande quanto un T-Rex mutante, quando ho provato a crearla:

Out of capacity for shape VM.Standard.A1.Flex in availability domain AD-1

Ho riprovato in AD-2, AD-3, combinando diversi fault domain. Niente. Le VM ARM gratuite sono talmente richieste che Oracle non riesce quasi mai a soddisfare le richieste. Ho provato in diversi orari, di notte, la mattina presto. Sempre lo stesso messaggio.

Lezioni dal primo muro in faccia

Questo primo tentativo mi ha insegnato molto:

  1. Nextcloud AIO è fantastico... se hai le risorse: con 2GB+ di RAM funziona perfettamente, ma sotto è troppo pesante.
  2. Le VM ARM gratuite sono un miraggio: esistono sulla carta, ma trovarle disponibili è una lotteria. Non basare i tuoi piani su di esse.
  3. I container Docker consumano: anche se Docker è più efficiente delle VM, ogni container ha un overhead. 7-8 container su 1GB RAM è irrealistico.
  4. La documentazione non sempre riflette la realtà: Nextcloud AIO dice "funziona con risorse minime", ma nella pratica serve ben più di 1GB.

Era il momento di cambiare strategia radicalmente.

Eureka! tutto funziona con Docker leggero e architettura minimale

Dopo il fallimento con AIO, ho fatto un passo indietro e ripensato l'architettura da zero.

La domanda chiave: cosa mi serve davvero?

Risposta: calendario e task. Non ho bisogno di 50GB di foto, collaborazione in tempo reale, videoconferenze. Solo CalDAV funzionante.

Il piano: invece di 7-8 container pesanti, solo 2 leggeri:

  • Nextcloud con SQLite (tutto in uno)
  • Caddy per HTTPS automatico

Architettura finale: minimal ma completa

Invece di 7-8 container, ho optato per una configurazione a 2 container:

1. Nextcloud: container ufficiale con database SQLite integrato

2. Caddy: reverse proxy per HTTPS automatico

Perché SQLite invece di PostgreSQL? Su installazioni piccole (1 utente, pochi dati), SQLite è più che sufficiente e consuma zero RAM aggiuntiva. Il database è un semplice file sul filesystem.

Perché Caddy? È un reverse proxy moderno che ottiene certificati Let's Encrypt automaticamente, senza configurazione. Nginx o Apache richiederebbero script aggiuntivi tipo Certbot.

Setup Oracle Cloud (la seconda volta è più veloce)

Ho terminato la VM precedente e ne ho creata una nuova, questa volta sapendo esattamente cosa fare:

Name: nextcloud-docker
Image: Canonical Ubuntu 24.04
Shape: VM.Standard.E2.1.Micro (1GB RAM)
Networking: 
  - VCN: nextcloud-vcn (riutilizzo quella già esistente)
  - Subnet: public subnet (con IP pubblico)
Boot volume: 50GBCode language: CSS (css)

Configurazione firewall Oracle (Security List):

  • Porta 22:SSH
  • Porta 80:HTTP
  • Porta 443:HTTPS

Configurazione firewall Ubuntu (iptables):

sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 443 -j ACCEPT
sudo netfilter-persistent saveCode language: PHP (php)

Oracle Cloud ha un doppio firewall (cloud-level + OS-level), quindi vanno configurati entrambi.

Andiamo di Docker e Nextcloud!

Installazione Docker:

# Aggiorna sistema
sudo apt update && sudo apt upgrade -y

# Installa Docker (script ufficiale)
curl -fsSL https://get.docker.com | sudo sh

# Aggiungi utente al gruppo docker
sudo usermod -aG docker ubuntu
newgrp dockerCode language: PHP (php)

Creazione directory di lavoro:

mkdir -p ~/nextcloud-docker
cd ~/nextcloud-docker

File docker-compose.yml:

version: '3'

services:
  nextcloud:
    image: nextcloud:latest
    container_name: nextcloud
    restart: always
    ports:
      - "8080:80"
    volumes:
      - nextcloud_data:/var/www/html
    environment:
      - SQLITE_DATABASE=nextcloud
      - NEXTCLOUD_ADMIN_USER=admin
      - NEXTCLOUD_ADMIN_PASSWORD=TuaPasswordForteQui123!
      - NEXTCLOUD_TRUSTED_DOMAINS=tuo-dominio.duckdns.org
      - OVERWRITEPROTOCOL=https
      - OVERWRITEHOST=tuo-dominio.duckdns.org

  caddy:
    image: caddy:latest
    container_name: caddy
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - caddy_data:/data
      - caddy_config:/config
      - ./Caddyfile:/etc/caddy/Caddyfile
    depends_on:
      - nextcloud

volumes:
  nextcloud_data:
  caddy_data:
  caddy_config:Code language: PHP (php)

Configurazione Caddy

tuo-dominio.duckdns.org {
    reverse_proxy nextcloud:80
    
    # Headers di sicurezza
    header {
        Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
        X-Content-Type-Options "nosniff"
        X-Frame-Options "SAMEORIGIN"
        Referrer-Policy "no-referrer-when-downgrade"
    }
}Code language: PHP (php)

Configurazione DuckDNS (dominio gratuito):

  1. Vai su duckdns.org
  2. Login con GitHub/Google (no registrazione)
  3. Crea sottodominio: scegli un nome (es: nextcloud-tuonome)
  4. Inserisci l'IP pubblico della VM Oracle
  5. Save
  6. Risultato: nextcloud-tuonome.duckdns.org punta al tuo server.

Avviamo tuttooooo!

docker compose up -d

Controlliamo i due container con docker ps e vedremo correttamente con status Up i container nextcloud e caddy.

Accediamo e configuriamo tutto su Nextcloud:

Da browser andiamo su https://tuo-dominio.duckdns.org.

Dopo 1-2 minuti (Caddy deve ottenere il certificato SSL), vedrai la pagina di Nextcloud con lucchetto verde (HTTPS valido)! 🎉

Dentro NextCloud abilitiamo Calendar e Tasks. Per un ulteriore sicurezza abilitiamo e configuriamo Two-Factor Authentcation installando "Two-Factor TOTP Provider". E scansioniamo il QR code sulla nostra app di autenticazione.

Creiamo una App Password per Client, perchè avendo abilitato la 2FA i client (nel mio caso DAVx⁵, Thunderbird), non possono usare la password normale.

Ci siamo quasi! Configuriamo client e sincronizziamo tutti i dispositivi

Avere Nextcloud funzionante è metà dell'opera. Ora serve sincronizzare calendari e task su tutti i dispositivi.

GrapheneOS: DAVx⁵ come ponte CalDAV

GrapheneOS non ha integrazione CalDAV nativa. Serve un'app che faccia da "ponte" tra il server Nextcloud e le app locali. DAVx⁵ è lo standard de facto.

Installiamo quindi il nostro ponte, e lo configuriamo. (basta seguire le istruzioni a schermo).

Ora passiamo a Fossify Calendar, semplicemente selezioniamo l'opzione DAVx⁵, e selezioniamo i calendari che vogliamo sincronizzare. Ed ecco che si popolerà con i nostri eventi!

Ora andiamo su Task.org e anche qui abilitiamo il sync!.

Importante per le liste:
In Tasks.org puoi creare task **dentro** le liste sincronizzate, ma **non puoi creare nuove liste CalDAV** dall'app. Le liste si creano su Nextcloud

Ora andiamo su desktop, userò sia su mac che linux Thunderbird

Se non hai thunderbird puoi scaricarlo qui! Configura la mail che vuoi usare e sulla vista calendar scegliamo di aggiungere i calendari da "On the Network", inseriamo i dati (la password se hai usato 2FA, usa quella creata con APP Password su Nextcloud).

Facciamo la stessa cosa per le task e via! siamo finalmente pronti!

Per le specifiche per linux aspetto l'arrivo del mio primo thikpad usato per installare tuttoooooo!

Tutto funziona. La sincronizzazione è affidabile, veloce, bidirezionale. Esattamente quello che volevo.

Quanto mi è costato tutto questo?

Setup iniziale (one-time):

  • Oracle Cloud account: 0€ (carta di credito richiesta solo per verifica, no addebiti)
  • Dominio DuckDNS: 0€ (servizio gratuito)
  • Software (Ubuntu, Docker, Nextcloud, Caddy): 0€ (tutto open source)
  • Totale setup: 0€

Ok.... ho preso un pò di muri in faccia, ma sperimentare e imparare è stato divertentissimo. Ho imparato:

Linux system administration:

  • Gestione pacchetti (apt)
  • Firewall (iptables, netfilter-persistent)
  • Gestione utenti e permessi
  • SSH key authentication
  • Troubleshooting logs (journalctl, docker logs)

Networking:

  • Virtual Cloud Networks (VCN)
  • Subnet pubbliche e private
  • Security Lists (firewall cloud)
  • DNS e DDNS (DuckDNS)
  • Reverse proxy
  • HTTPS e certificati SSL

Docker:

  • Container vs immagini
  • Docker Compose (orchestrazione multi-container)
  • Volumi per persistenza dati
  • Port mapping
  • Gestione lifecycle (start, stop, restart, logs)
  • Troubleshooting (out of memory, port conflicts)

Protocolli e standard:

  • CalDAV e CardDAV
  • TOTP (2FA)
  • App Password vs password principale
  • OAuth flow (authorization grant in Nextcloud)

Debugging e problem solving:

  • Leggere log per capire errori
  • Googling efficace per problemi tecnici
  • Quando insistere e quando cambiare approccio
  • Gestione fallimenti (AIO non funzionava → pivot a soluzione leggera)

Avvio il testing per il primo mese!

Da oggi inizierò a usare questo setup per il mio calendario e task. Al momento posso dire i vantaggi che sto iniziando a respirare:

Privacy e controllo:

  • I miei dati sono miei. Non su server Google, Apple, Microsoft. Su un server che controllo io, in un datacenter europeo GDPR-compliant.
  • Zero profilazione. Nessun algoritmo analizza i miei appuntamenti per mostrarmi pubblicità.
  • Trasparenza totale. Posso vedere esattamente cosa fa il server (log, codice open source).

Nessun vendor lock-in:

  • Standard CalDAV: funziona con qualsiasi client (Fossify, Thunderbird, Evolution, GNOME Calendar, Apple Calendar, ecc.)
  • Migrazione facile: se domani volessi passare a Baikal, Radicale, o altro server CalDAV, basta cambiare URL. I dati sono miei.
  • Esportazione: posso esportare calendari in formato .ics universale in qualsiasi momento.

Costo zero:

  • Oracle Free Tier è davvero gratis per sempre (verificato, nessun addebito dopo 1 mese)
  • Nessun piano a pagamento nascosto, nessun limite artificiale

Apprendimento

  • Ho imparato Docker, reverse proxy, SSL, CalDAV
  • Competenze spendibili per altri progetti (self-host Immich per foto, Vaultwarden per password, ecc.)
  • Soddisfazione personale: "L'ho fatto io, funziona"

Flessibilità:

  • Posso aggiungere servizi: sincronizzazione file, note, feed RSS, bookmark
  • Posso modificare configurazione (es: aggiungere utenti per famiglia)
  • Posso sperimentare senza vincoli

❌ Svantaggi (ciò che non funziona o è faticoso)

Complessità iniziale:

  • 6 ore per setup completo (inclusi fallimenti)
  • Curva di apprendimento ripida se parti da zero
  • Frustrante quando qualcosa non funziona e non capisci perché

Responsabilità manutenzione:

  • Io devo aggiornare il sistema, non lo fa nessuno per me
  • Io devo fare backup (Nextcloud ha strumenti, ma vanno configurati)
  • Io devo monitorare che tutto funzioni
  • Se il server va down, resto senza calendari fino a che non lo riparo

Nessun supporto ufficiale:

  • Se qualcosa si rompe, devo risolvere da solo (o chiedere su forum/Reddit/Stack Overflow)
  • Nessun numero verde, nessun ticket di supporto
  • A volte la documentazione è incompleta o obsoleta

Limitazioni tecniche VM 1GB:

  • Non posso abilitare tutte le app Nextcloud (es: Collabora Office crasherebbe)
  • Performance non paragonabili a servizi cloud professionali (ma per calendario/task basta)
  • Backup sul server stesso (servirebbe storage esterno per vera ridondanza)

Dipendenza da Oracle Cloud:

  • Se Oracle decide di terminare il Free Tier (improbabile ma possibile), devo migrare
  • Se il datacenter Frankfurt ha downtime, il mio Nextcloud è offline
  • Nessuno garantisce uptime 99.9%

Funzionalità mancanti vs Google Calendar:

  • No integrazione Gmail (inviti meeting via email non si aggiungono automaticamente)
  • No suggerimenti intelligenti tipo "aggiungi indirizzo al calendario"
  • No app mobile Nextcloud (uso client CalDAV generici, funzionali ma meno integrati)

Risorse utili

Link documentazione:

Community e supporto:

  • Nextcloud forum: https://help.nextcloud.com
  • r/selfhosted (Reddit): ottima community
  • r/NextCloud (Reddit)
  • Stack Overflow: per errori specifici

Tool e servizi usati:


Note finali

Questo articolo documenta il mio percorso reale, errori inclusi. Non è una guida "perfetta" o "definitiva", ma un resoconto onesto di cosa funziona, cosa no, e cosa ho imparato.

Grazie per aver letto fino alla fine. Spero che questo viaggio tra Docker, calendari, e container crashati ti sia stato utile, informativo, o almeno divertente.

Self-hosting is hard. Ma ne vale la pena. 🚀

🚨 Update!

📢 Aggiornamento

Dopo aver usato il sistema per qualche giorno, ho apportato miglioramenti, e non escludo che continuerò a giocare 🙂

Separazione app native

Ho abbandonato Thunderbird come "app tuttofare" su Mac, preferendo le app native di sistema:

  • Calendar.app per calendari (sync CalDAV)
  • Contacts.app per contatti (sync CardDAV)
  • Reminders.app per task

Risultato: interfaccia più fluida, startup istantaneo, integrazione profonda con macOS (Siri, Spotlight, widget).

Backup automatico settimanale

Implementato sistema di backup completo con script bash e cron job (ogni domenica alle 3 AM):

  • Database completo (contiene calendari, contatti, tasks)
  • Calendari export in formato `.ics` (portabile)
  • Contatti export in formato `.vcf` (portabile)
  • Configurazione sistema e lista app installate

I backup vengono salvati nella cartella Nextcloud Files e sincronizzati automaticamente sul mio smartphone GrapheneOS, disponibili offline. Retention: 4 settimane.

Gestione risorse e swap memory

La VM Oracle Free Tier ha solo 1GB RAM. Durante operazioni intensive (backup, export contatti) il sistema crashava per Out of Memory. Ho implementato 2GB di swap su disco che funge da "RAM di emergenza":

  • Sistema più stabile (zero crash)
  • Performance leggermente ridotta durante picchi (swap è più lento di RAM)
  • Configurazione permanente (survives reboot)

Hardening sicurezza

Il setup iniziale funzionava ma era troppo basilare per uso production. Ho aggiunto:

Security headers completi:

  • HSTS (HTTP Strict Transport Security)
  • X-Frame-Options, X-Content-Type-Options
  • Content Security Policy (CSP)
  • Rate limiting contro brute force

Autenticazione rinforzata:

  • 2FA obbligatorio con TOTP (Time-based One-Time Password)
  • App Password dedicate per ogni dispositivo/applicazione
  • Trusted domains configurati correttamente

Related Post

Aprile 1, 2025
🎉 Level Up! Ho completato il corso “Complete Python Developer” e sbloccato nuove skill!

🎉 Level Up! Ho appena completato il corso “Complete Python Developer: Zero to Mastery” e mi sento come se avessi appena sbloccato un nuovo achievement nel mondo della programmazione! 🏆🐍 Un viaggio entusiasmante affrontato con il mio approccio preferito: sperimentare, costruire e imparare divertendomi… e sì, anche combattere qualche bug lungo il cammino. Ma del […]

Febbraio 7, 2026
Claude Code: Assaggiare il Pair Programming con con un collega artificiale

Da quando uso Claude Code, il mio modo di sviluppare è cambiato. Non tanto perché scrive codice al posto mio, ma perché è diventato il mio pair programming partner: qualcuno con cui discutere scelte architetturali, validare pattern, ragionare su trade-off. Quando lavoro da sola, è facile restare incastrata nelle mie assunzioni. Avere Claude che fa […]

veronicaschembri
Copyright © Veronica Schembri

Privacy Policy
Cookie Policy
💬