Self-HostingTour della JetKVM web UI sulla mia LattePanda: virtual media, Wake on LAN e la killer demo — entro nel BIOS dal browser e mostro come reinstallare l'OS da remoto.
Self-HostingHo messo CloakBrowser Playwright stealth contro 4 detector per il bypass bot detection: sannysoft e deviceandbrowserinfo verdi, CreepJS resta al 25%.

1 aprile 2026 · 9 min lettura
Vaultwarden self-hosted homelab: setup completo su Proxmox LXC con Caddy HTTPS, admin panel sigillato e backup testato. Sette decisioni motivate.
Iscriviti alla newsletter per ricevere i migliori articoli direttamente nella tua inbox.
Con Authentik SSO homelab si smette di gestire decine di utenti locali sparsi tra Grafana, Forgejo, n8n, Gitea e compagnia. Un solo identity provider, un solo login, un solo posto dove revocare un accesso.Sul nostro homelab — Proxmox, 14 container LXC, NetBird come VPN — abbiamo messo in produzione Authentik 2025.2 con licenza enterprise. Questo post racconta esattamente come funziona su due servizi reali: Grafana e Forgejo.

Il problema non è la sicurezza in astratto. È pratico: quando hai 14 servizi in produzione, ogni nuovo utente significa 14 account da creare, 14 password da gestire, 14 posti dove dimenticare di revocare l'accesso quando qualcuno lascia il progetto.
Authentik risolve questo a livello strutturale. Non è un proxy di autenticazione — è un identity provider completo con supporto OAuth2, OIDC, SAML, LDAP e SCIM. La differenza con soluzioni più leggere come Authelia è sostanziale: Authentik gestisce il consent flow, il role mapping granulare, l'impersonation per il debug, e con la licenza enterprise aggiunge RBAC avanzato e audit logging persistente. Authelia fa forward auth. Authentik fa identity management.
Authentik gira su CT 121 via Docker Compose: container server + worker + PostgreSQL 16 + Redis (nota: da authentik 2025.10 Redis è stato completamente rimosso). Il dominio pubblico è auth.homelabz.cc , esposto tramite Nginx reverse proxy con HTTPS. L'hardware sottostante — Ryzen 7 1800X, 48 GB ECC, ZFS mirror SSD — regge senza problemi, ma Authentik è ragionevolmente leggero: a regime consuma meno di 400 MB RAM.
La licenza enterprise (20 utenti interni + 20 esterni, valida fino a marzo 2027) sblocca capability specifiche: can_save_media , can_asn , can_geo_ip , can_impersonate e is_enterprise . Il flag can_impersonate vale oro in un homelab con più collaboratori: puoi assumere l'identità di un utente per riprodurre esattamente il suo contesto e diagnosticare problemi di accesso senza chiedergli la password.
Grafana 12.4.1 su CT 103. L'integrazione usa il provider generic_oauth con PKCE abilitato — lo standard che protegge il flusso OAuth2 aggiungendo un code_verifier/code_challenge per prevenire l'intercettazione del codice di autorizzazione. Scopes richiesti: openid email profile .
[auth.generic_oauth]
enabled = true
name = Authentik
client_id = <CLIENT_ID>
client_secret = <CLIENT_SECRET>
scopes = openid email profile
auth_url = https://auth.homelabz.cc/application/o/authorize/
token_url = https://auth.homelabz.cc/application/o/token/
api_url = https://auth.homelabz.cc/application/o/userinfo/
use_pkce = true
role_attribute_path = contains(groups[*], 'Grafana Admins') && 'Admin' || 'Viewer'
allow_sign_up = true
Il problema più comune — e meno documentato — è questo: se root_url non è configurato in grafana.ini , Grafana costruisce il redirect URI usando localhost come hostname. Authentik riceve un redirect verso http://localhost:3000/login/generic_oauth invece di https://grafana.homelabz.cc/login/generic_oauth , non trova corrispondenza nell'Application configurata, e restituisce Redirect URI Error . Blocco totale, messaggio criptico.
[server]
root_url = https://grafana.homelabz.ccIl role mapping via JMESPath funziona esattamente come ci si aspetta: l'espressione contains(groups[*], 'Grafana Admins') && 'Admin' || 'Viewer' assegna il ruolo Admin a chi appartiene al gruppo Grafana Admins in Authentik, Viewer a tutti gli altri. Nessuna configurazione manuale per ogni utente. Aggiungi un utente al gruppo — ha i permessi. Lo rimuovi — li perde.
Forgejo su CT 106 supporta OpenID Connect con auto-discovery, il che rende la configurazione più pulita rispetto a Grafana. Basta puntare all'URL di discovery di Authentik e il client recupera automaticamente tutti gli endpoint — token, userinfo, jwks.
forgejo admin auth add-oauth \
--name authentik \
--provider openidConnect \
--key <CLIENT_ID> \
--secret <CLIENT_SECRET> \
--auto-discover-url https://auth.homelabz.cc/application/o/forgejo/.well-known/openid-configuration \
--scopes "openid email profile" \
--auto-register \
--skip-local-two-faIl flag --auto-register crea automaticamente l'account Forgejo al primo login OIDC. --skip-local-two-fa delega la 2FA ad Authentik — che la gestisce meglio, con TOTP e notifiche push integrate.
Forgejo aveva ancora il vecchio IP nella variabile ROOT_URL — residuo di quando il container girava su un indirizzo diverso. Il risultato era identico al problema di Grafana: redirect verso un URL non registrato in Authentik, login bloccato. Aggiornare ROOT_URL all'indirizzo corretto risolve. Lezione: dopo ogni migrazione di container, verificare sempre ROOT_URL prima di configurare SSO.
Terzo gotcha, meno frequente: se usi un reverse proxy davanti ad Authentik (Caddy, Nginx, Traefik), assicurati che l'header X-Forwarded-Proto sia impostato correttamente. Senza, i redirect HTTPS si rompono in modo non ovvio — la pagina di login torna vuota senza un messaggio d'errore utile. La documentazione ufficiale per reverse proxy copre i requisiti generali e include un esempio completo per Nginx.
Il RBAC enterprise va oltre i gruppi semplici. Puoi definire policy granulari — per esempio, permettere l'accesso a Grafana solo agli utenti che soddisfano più condizioni simultanee: appartenenza al gruppo, IP di origine nella subnet management, orario di accesso. Le policy vengono valutate in pipeline con logica AND/OR configurabile tramite la UI dei Flow.
L'audit logging persistente è l'altra feature che giustifica la licenza enterprise in un contesto con più collaboratori. Ogni evento di autenticazione — login riuscito, fallito, token revocato, consent aggiornato — viene registrato con timestamp, utente, IP e applicazione. Non serve un SIEM esterno per avere visibilità su chi ha fatto cosa e quando.
Dopo settimane di utilizzo, il punto di forza non è la feature singola — è la riduzione di attrito operativo. Aggiungere un nuovo collaboratore significa creare un utente in Authentik e assegnarlo ai gruppi giusti. Nessun provisioning manuale su ogni servizio. La revoca è istantanea e completa: disabilita l'account in Authentik, quella persona perde l'accesso a tutti i servizi integrati in un colpo solo.
La nostra infrastruttura gira suNetBird VPN con tre subnet separate— management, backend, Docker. Authentik si integra naturalmente con questo schema: puoi creare policy che limitano l'accesso alle applicazioni interne solo agli utenti connessi dalla subnet management, senza modificare i servizi applicativi. Zero codice custom, tutto via Flow editor.
Come nota a margine: Authentik può proteggere anche una dashboard analytics self-hosted comeMatomo su PikaPodstramite OAuth2 proxy. È nella lista dei prossimi step del nostro homelab — centralizzare l'autenticazione anche lì.
Authentik ha un problema di complessità iniziale concreto. La UI è densa, la terminologia — Flow, Stage, Provider, Application, Source, Outpost — richiede tempo per essere interiorizzata, e la documentazione assume un certo livello di familiarità con i protocolli di identity. Per chi parte da zero su OAuth2 e OIDC, le prime ore sono dure.
Il worker è un processo separato obbligatorio — senza di lui le task in background non girano: email, cleanup dei token scaduti, notifiche eventi. Non un difetto di design, ma va messo in conto nell'architettura Docker. Il consumo di risorse a regime: con la configurazione precedente (PostgreSQL + Redis + server + worker) si attestava attorno a 600-700 MB RAM. Da authentik 2025.10, Redis è stato completamente rimosso come dipendenza, riducendo il footprint complessivo.
Un identity provider centralizzato riduce la superficie di attacco — ma la concentra. Se Authentik è compromesso, l'attaccante ha accesso a tutto. Non è un argomento contro Authentik, è un argomento per hardening serio: 2FA obbligatoria per tutti gli utenti, rate limiting sugli endpoint di login, aggiornamenti regolari, backup del database PostgreSQL su storage separato. Nel nostro caso auth.homelabz.cc è esposto pubblicamente con HTTPS, ma protetto da 2FA TOTP obbligatoria e monitoraggio attivo degli accessi tramite audit log enterprise.
Il post sullavulnerabilità ZimaOS e CasaOS con 22 CVEè un promemoria utile di cosa succede quando si espone su Internet software homelab non mantenuto. Vale anche per Authentik: la versione 2025.2 è in produzione da due mesi, gli aggiornamenti vanno applicati.
Documentazione Authentik:goauthentik.io/docs— Enterprise licensing:goauthentik.io/docs/enterprise— Grafana generic_oauth:grafana.com/docs/grafana/latest/setup-grafana/configure-security/configure-authentication/generic-oauth— Forgejo OAuth CLI:forgejo.org/docs/latest/admin/oauth2-provider
Authentik non è il percorso di minima resistenza. Richiede tempo per essere configurato correttamente, va mantenuto, e i gotcha come il root_url di Grafana costano ore la prima volta. Ma una volta in produzione, la gestione degli accessi smette di essere un problema operativo. Un utente, un login, un posto dove guardare. Su un homelab con 14 servizi in produzione e più collaboratori, questo vale il prezzo dell'investimento iniziale — e la licenza enterprise aggiunge le feature che contano davvero quando la struttura cresce.
La versione community è completamente free e self-hosted, con tutte le funzioni core (OAuth2, OIDC, SAML, LDAP, flussi custom). La Enterprise aggiunge support SLA, RAC e audit log avanzato. Per il mio homelab uso una licenza NFR enterprise ricevuta dal team Authentik, ma la community copre il 95% dei casi d'uso domestici.
Nel mio container LXC Proxmox gira stabile a 512 MB con 14 servizi collegati, con picchi verso gli 800 MB durante sync LDAP o restart del worker. Un LXC da 1 GB di RAM è sufficiente; consigliati 2 GB se aggiungi molti backend di autenticazione o flussi custom complessi.
Con le app che supportano OIDC o OAuth2 (Grafana, Forgejo, Nextcloud, Vaultwarden, Gitea) l'integrazione è nativa e si configura in pochi minuti. Per le app legacy senza SSO built-in uso il proxy provider di Authentik, che inietta header di autenticazione davanti all'applicazione: così ho coperto anche servizi che non avrebbero mai parlato OIDC.