Rosie — architettura, sicurezza, esercizio
Il riferimento tecnico per i fornitori informatici e i responsabili IT presso il cliente. Istanza svizzera, header di sicurezza, cache dell’app, notifiche web, migrazioni della banca dati, backup, osservabilità ed escalation — tutto tracciabile. I nomi dei fornitori compaiono qui di proposito, perché dovete impostare le abilitazioni del firewall e documentare l’esternalizzazione.
Architettura del sistema
Rosie è un’ app web progressiva in JavaScript puro. L’applicazione gira come processo Node su un’istanza Debian presso Infomaniak, in Svizzera, preceduta da Caddy come proxy inverso con gestione automatica dei certificati. La persistenza avviene tramite libSQL/SQLite sulla stessa istanza (modalità WAL), lo storage a oggetti tramite lo storage a oggetti compatibile S3 di Infomaniak. Il service worker lavora con un CACHE_PREFIX per ogni versione. Davanti al sito pubblico è posto un servizio di protezione — non conserva dati; l’interfaccia si rivolge direttamente all’istanza svizzera.
Compatibilità dei browser
DNS e domini
- Dominio principale:
rosie-app.ch(incl.www). - Alias / mirror:
rosie-planer.com— come reindirizzamento 301. Va considerata una finestra di cache di circa due minuti, che si risolve da sé. Verifica immediata dell’origine tramite?cb=<random>. - Sottodominio dell’app: l’applicazione gira sotto un nome proprio che punta direttamente all’istanza svizzera («solo DNS», senza servizio intermedio).
- Nessuna voce jolly.
*.rosie-app.chnon esiste — un nome inventato non si risolve. È voluto ed esclude l’appropriazione di un sottodominio. - Servizio di protezione a monte solo per il sito pubblico; non conserva dati dei clienti.
rosie-planer.com può provenire brevemente dalla cache del servizio a monte. Si risolve da sé. Per l’analisi: richiesta all’origine con parametro anti-cache.Header di sicurezza
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload — impostato dall’applicazione stessa, così l’header vale indipendentemente dal servizio a monte. L’invio su hstspreload.org avviene manualmente.WORKER_VERSION = RELEASE, importato da shared/version.mjs (fonte unica).curl -I https://rosie-app.ch mostra tutti gli header impostati, compresi HSTS, CSP, X-Worker-Version e X-Request-Id.includeSubDomains vale per ogni sottodominio, compresi i nomi di test e di collaudo. E un header HSTS già consegnato resta valido nel browser fino a due anni — non si può ritirare a breve termine.Service worker, cache delle risorse
sw.jscon CACHE_PREFIX, marcato dashared/version.mjs(scripts/sync-version.mjs).- Cache a monte: circa due minuti di ritardo dopo la messa in produzione, che si risolve da sé.
immutableheader di cache per le risorse con versione.- Librerie caricate su richiesta tramite
_loadVendor— XLSX, html2canvas. - Schermata di avvio iOS obbligatoriamente in PNG — WebP abbandonato dalla versione r168.
- Nessuna sincronizzazione in background — di proposito: una riesecuzione senza scheda aperta non avrebbe un token valido e rischierebbe doppie registrazioni in mancanza di chiavi di idempotenza. La coda della chat si svuota solo con l’app aperta (v.
docs/OFFLINE.md). - Notifiche web su iOS solo nell’app installata — imporre l’aggiunta alla schermata Home.
RELEASE in shared/version.mjs poi npm run version:sync — CACHE_PREFIX in sw.js / src/constants.js vengono marcati automaticamente; nulla da aggiornare a mano.Notifiche web (RFC 8291)
- Chiavi VAPID (pubblica e privata) conservate come segreti sull’istanza, sotto
/etc/rosie/env. subscribeToPushNotificationsè un UPSERT idempotente.- Le ore di silenzio sono rispettate.
- Attivazione per categoria di allarme:
bounty·planPublished·adminAlert·messages·absenceResult.
Firewall / rete
- Solo HTTPS in uscita sulla porta 443.
- Abilitazione per
rosie-app.che il sottodominio dell’app. Non servono altre destinazioni — l’app non richiama da sé alcun servizio presso il cliente. - Nessuna porta in entrata.
- WebSocket non necessario — l’app interroga il server ogni 60 secondi.
Sistema di posta elettronica
Invio tramite SMTP verso una casella svizzera presso Hostpoint. Il mittente di tutte le e-mail di sistema è support@rosie-app.ch — un indirizzo a cui si può rispondere, non un vicolo cieco. SPF, DKIM e DMARC sono impostati; consigliamo di provare una volta la consegna contro il filtro antispam del cliente dopo la prima configurazione.
rosie-app.ch . Inserire l’indirizzo support@rosie-app.ch nella lista dei mittenti attendibili risolve la maggior parte dei casi.Mobile & MDM
- iOS 14.5+, Android 8.0+.
- App web — nessun pacchetto da store.
- Il MDM può configurare il browser preferito, i collegamenti sulla schermata Home e i siti attendibili .
- Da notare: Notifiche web su iOS richiede l’app installata; schermata di avvio iOS in PNG (non WebP).
Migrazioni e versioni dello schema
Le migrazioni si trovano sotto database/migrations/ , numerate progressivamente, e vengono applicate solo in avanti. Lo stato attuale è nella cartella stessa — questa pagina non indica di proposito alcun numero, che sarebbe sbagliato già alla versione successiva. Dopo ogni esecuzione segue una verifica dello schema. Le migrazioni sono costruite in modo da poter ricostruire per intero una banca dati vuota.
Backup & Ripristino
- Backup automatici della banca dati, cifrati e depositati fuori sede.
- Finestra di ripristino di 30 giorni con punti di ripristino ogni ora (perdita massima di dati: un’ora).
- Storage a oggetti viene sottoposto a backup separato.
- Esportazione completa dei dati per mandante, in qualsiasi momento dall’interfaccia di amministrazione.
- Nessuna ridondanza geografica. Si gestisce di proposito una sola istanza di produzione: un riavvio o un aggiornamento comporta una breve interruzione. È un compromesso noto e accettato, recuperabile senza cambiare l’architettura.
Ripristino della versione precedente
A ogni versione corrisponde un’etichetta checkpoint-rNNN-deployed nel sistema di gestione del codice sorgente. Si può così dimostrare in ogni momento quale versione era in produzione e quando.
curl -I → X-Worker-Version da controllare.Isolamento dei mandanti
- Filtro dei mandanti lato server —
tenant_idin ogni interrogazione. - Le variabili globali del mandante in memoria vengono svuotate al logout tramite
_resetTenantCalendarData()(sei variabili del calendario). - I test sulle fughe fra mandanti sono fissati da casi di regressione.
- Attivazione del salvataggio tramite marcatore del mandante
companySettingsDirty.
Osservabilità & Registri
- X-Worker-Version (r166 A10), X-Request-Id in ogni risposta.
- Web Vitals →
/api/analytics, invio in keepalive, segnale «Do Not Track» rispettato. - Filtro dei dati personali prima di ogni analisi.
- k-anonimato ≥ 4 per i grafici aggregati.
- Registri si trovano sull’istanza (systemd/journald) e vengono analizzati dal fornitore; un monitoraggio esterno controlla la raggiungibilità e allerta.
Budget di prestazione
- Obiettivi LCP / CLS / INP come budget di prestazione.
- Correzione dello spostamento visivo:
width/heightsui tag<img>. - Librerie caricate su richiesta tramite
_loadVendor— XLSX / html2canvas. - Risparmio batteria: l’interrogazione si sospende quando
document.hidden(pausa alla perdita di visibilità).
Principali endpoint API
/api/staff · /api/shift-assignments · /api/vacations/api/absences · /api/absences/:id/{approve,reject,cancel} · /api/absence-approval-config/api/messages · /api/suggestions/api/qms/documents/api/tasks · /api/tasks/templates · /api/tasks/:id/qms-links (PATCH) · /api/tasks/audit/api/mutations · /api/onboarding/:step/api/analytics · /api/log/api/profile/r163-monatsabschluss · /r163-monatsabschluss/:year_month (POST / DELETE)/api/feed-proxyX-Worker-Version) e un identificativo della richiesta (X-Request-Id).Sistema di IA & Firewall per la protezione dei dati
- Fornitore di IA: attivabile per mandante; un servizio fisso per ogni scopo, senza servizio di riserva automatico. Quale fornitore venga impiegato è indicato nell’elenco dei subincaricati del contratto di trattamento — non qui, perché questa pagina non diventi falsa in caso di cambiamento.
- Limite di frequenza: 30 richieste all’ora per utente.
- Il filtro dei dati personali rimuove indirizzo e-mail, numero AVS, IBAN, telefono e data prima di ogni chiamata al servizio di IA.
- Attività pianificate dell’IA
0 2/0 4per l’apprendimento dei modelli dei compiti — richieste senzastaff.id. - Riconoscimento vocale: gestito dal browser (Web Speech API); a seconda del browser o del sistema operativo, la registrazione viene inviata al suo servizio di riconoscimento vocale — ROSIE non riceve né conserva alcuna registrazione audio. Per il riconoscimento del comando, solo il testo riconosciuto va al servizio di IA, con consenso (art. 6 cpv. 6 nLPD).
Sistema di moduli
Moduli opzionali: Gestione della qualità (QMS), Voice-to-Schedule, Preparazione salari & finanze, Smart Matchmaker, Radar di carico, Rete regionale. Attivazione per mandante tramite Amministrazione → Strumenti.
Accessibilità & Lingue
- Tasto Esc globale e trappola del focus .
- Barra di avanzamento ARIA .
- Quattro lingue dell’interfaccia: DE / FR / IT / EN.
- 14 lingue nella chat per la comunicazione interna — la traduzione avviene sul dispositivo.
Gestione dei segreti
- I segreti si trovano in
/etc/rosie/envsull’istanza, leggibili solo dall’utente di servizio: chiave di firma delle sessioni, coppia di chiavi VAPID, credenziali per lo storage a oggetti, l’SMTP e il servizio di IA. - Rinnovare ogni anno la chiave di firma.
- La rotazione delle chiavi VAPID invalida le sottoscrizioni alle notifiche (limite noto).
- Hashing delle password: PBKDF2-SHA-256 con sale, in quattro passaggi concatenati da 100 000 iterazioni ciascuno (400 000 in totale).
Prima configurazione lato informatico
La creazione di un mandante avviene presso il fornitore, sull’istanza svizzera. Presso il cliente non serve alcuna installazione — nessun server, nessun agente, nessuna porta in entrata. Quel che segue è l’elenco dei punti che spettano davvero al cliente.
curl -I sull’indirizzo dell’app — header, compreso X-Worker-Version da controllare.support@rosie-app.ch da abilitare.Risoluzione dei guasti & Assistenza
Esistono procedure per: errori di accesso · errori della banca dati · errori di messa in produzione · consegna delle e-mail · guasto dell’IA · consegna delle notifiche · errori di migrazione.
support@rosie-app.ch. I tempi di reazione sono regolati dal contratto di servizio, non da questo manuale. Per le segnalazioni di sicurezza vale il canale indicato sotto /.well-known/security.txt.X-Request-Id e l’orario.Verifica della protezione dei dati
- TLS 1.3.
- AES-256 a riposo. I campi di testo libero particolarmente degni di protezione sono inoltre cifrati singolarmente.
- Conservazione dei dati in Svizzera (Infomaniak): potenza di calcolo, banca dati, storage a oggetti e backup. Il servizio di protezione posto davanti al sito pubblico e il fornitore dei pagamenti sono nominati nell’elenco dei subincaricati del contratto di trattamento.
- Contratto di trattamento disponibile.
- Nessun cookie, nessun tracciamento — il segnale «Do Not Track» è rispettato.
- Distruzione delle chiavi come revoca operativa; cancellazione entro 30 giorni dalla fine del contratto, con attestato scritto.
- L’SSO (SAML/OIDC) è non disponibile ed è in valutazione; non esiste una data vincolante. Accesso con e-mail e password, con TOTP opzionale.
Domande frequenti per l’informatica
rosie-app.ch e il sottodominio dell’app — le chiamate al servizio di IA partono dall’istanza, non dalla postazione.rosie-planer.com è brevemente obsoleto dopo una messa in produzione?▶?cb=<random>).curl -I sul dominio — l’header X-Worker-Version indica il numero di versione attivo, X-Request-Id la singola richiesta, per la correlazione nei registri del server.Fornitore e responsabile del trattamento: Digital Passion GmbH, Haldenstrasse 16, 4600 Olten · CHE-154.512.796
Domande? support@rosie-app.ch · rosie-app.ch
← Torna alla panoramica