Pyrite ENMenu Scarica l'alpha
Indice della documentazione

Documentazione · per l'amministratore

Guida per l'amministratore

Dal primo avvio alla gestione di tutti i giorni. Per ogni procedura è indicata la parte della console del motore in cui si trova e, quando serve, chi la può fare: un Proprietario o un Admin.

01 /Requisiti

02 /Primo avvio

  1. Copia la cartella dove vuoi tenerla, poi fai doppio clic su pyrite.exe.
  2. Il motore parte in sottofondo, senza finestra nera: compare un'icona di Pyrite (i cubi del logo) nell'area di notifica, vicino all'orologio (se non la vedi, apri la freccetta ^ accanto all'orologio).
  3. La prima volta che il programma parte da una cartella, Windows mostra la finestra «Sicurezza di Windows»: scegli Reti private e consenti. Se annulli, o scegli solo le reti pubbliche, gli altri computer della rete non raggiungono il portale e le app. Windows lo chiede di nuovo per ogni cartella nuova e per ogni file del programma con un altro nome o in un altro posto; una scelta sbagliata si corregge nelle impostazioni del firewall di Windows («Consenti app o funzionalità attraverso Windows Defender Firewall»), oppure con pyrite.exe firewall open da amministratore (vedi Il firewall di Windows).
  4. Il browser si apre da solo; su un motore nuovo mostra la pagina di primo avvio (http://127.0.0.1:8080/setup/), dove crei il primo Proprietario del motore: il codice del primo avvio (vedi sotto), la tua email, il tuo nome (facoltativo) e una password con almeno 8 caratteri, una lettera maiuscola e una minuscola, un numero e un carattere speciale. Il Proprietario è una persona della rubrica, come tutte le altre.
  5. Creato il Proprietario, si apre la console del motore, già con l'accesso fatto. Da lì in poi: console su http://NOME-O-IP-DEL-SERVER:8080/console/, portale su http://NOME-O-IP-DEL-SERVER:8080/ per chi usa le app. Finché il primo Proprietario non c'è, le app non partono.

Se il browser non si apre, apri a mano http://127.0.0.1:8080/setup/ su questo computer. Se la pagina non si può aprire proprio (per esempio su un server senza browser), crea il Proprietario da un prompt dei comandi nella cartella: pyrite.exe owner create EMAIL scrive una sola volta una password provvisoria; entra nella console con quella e scegline una nuova (vedi Per i tecnici).

Il codice del primo avvio

La pagina di primo avvio si apre da qualunque computer della rete, mai da internet, e solo finché un Proprietario non c'è. Per creare il Proprietario chiede un codice che Pyrite stampa sul server, così nessun altro della rete può prendersi il motore prima di te.

03 /La console e i livelli

La console è l'area di gestione del motore: app, persone, gruppi, backup, eventi. Apri http://SERVER:8080/console/: la pagina d'accesso (/console/accesso/) chiede l'email e la password del tuo account della rubrica. Entrano solo Proprietari e Admin; il vecchio indirizzo /_/ porta alla console, quindi i segnalibri di prima funzionano ancora.

Se usi Pyrite da solo, il Proprietario sei tu: i livelli qui sotto servono solo quando altre persone ti aiutano a gestire.

Nella console e nel portale trovi ancora parole pensate per un'azienda: sono i testi del programma, e per ora restano così. «IT» è chi gestisce Pyrite; i «colleghi» sono le altre persone che usano le app; l'«ufficio» è la rete locale; «Tutta l'azienda» è l'unità di partenza, che puoi rinominare. Anche il titolo e i testi d'ingresso del portale («Applicazioni aziendali») li cambia un Proprietario, nella pagina Home del portale.

livellocosa può fare
ProprietarioTutto. Tutte le app («Nuova app», «Rileggi cartelle», la scheda Configurazione, l'archiviazione, l'approvazione delle app caricate), persone e gruppi di ogni livello, il livello di ogni persona e le app che gestisce ogni Admin, Impostazioni del motore, Home del portale, Analisi, i backup di tutto, gli eventi del motore. In alto, Log (la pagina dei log del motore con il grafico) e Avanzate: gli strumenti di PocketBase del motore dentro la console (impostazioni di PocketBase: posta, archiviazione, backup, cron, esportazione e importazione delle raccolte, console SQL con un avviso; il registro dati solo per le raccolte che nessuna pagina della console gestisce, se ce ne sono). L'ultimo Proprietario attivo non si può eliminare, disattivare o spostare a un altro livello.
Admin PersoneLe persone e i gruppi della sua unità, e il nome della sua unità in cima. Non vede le app. Vede e gestisce solo persone e gruppi di quell'unità; una persona la cambia solo chi amministra tutte le sue unità. Ha la voce Storico: chi ha creato, rinominato, fermato o riattivato le persone dell'unità, chi ha dato una password provvisoria, i gruppi creati e i membri cambiati, i cambi di password e gli accessi alla console di quelle persone. Non vede gli eventi delle app, quelli del motore, chi è diventato Admin di che cosa, gli indirizzi di rete, né gli eventi di una persona che sta anche in un'unità che non amministra. Non legge nome ed email dei Proprietari (al loro posto c'è «Proprietario»). Il ruolo lo dà un Proprietario, per unità.
Admin AppLe sue app, date per unità o per singola app: avvio, arresto e riavvio, backup, dati, accessi. Sceglie i gruppi dell'unità dell'app; dà l'accesso a una persona sola scrivendo l'email esatta nella scheda Accessi dell'app (solo persone dell'unità dell'app). Non vede le persone. L'Admin App di un'unità intera può caricare app nuove in quell'unità; quello di una singola app no. Il ruolo lo dà un Proprietario, per unità o per app.
Admin (come nella 0.7.5)Solo le app che gli assegna un Proprietario: avvio, arresto e riavvio, accessi e ruoli, backup, log dell'app, import e scheda Dati. Vede tutta la rubrica tranne i Proprietari, che compaiono come «Proprietario» senza email. Gestisce le persone di livello Utente: le aggiunge (password iniziale, da cambiare al primo accesso), ne cambia nome ed email, dà una password provvisoria, le disattiva e le riattiva, dà e toglie l'accesso alle sue app; ogni modifica finisce negli eventi. Non elimina persone e non cambia i livelli; vede gli altri Admin ma non li modifica. Crea gruppi e ne cambia i membri solo per i gruppi che danno accesso soltanto ad app gestite da lui; gli altri gruppi li vede in sola lettura. Può caricare app, che aspettano l'approvazione di un Proprietario.
UtenteIl portale e le applicazioni a cui ha accesso. Non entra nella console.

I ruoli li dà un Proprietario nella scheda della persona, riquadro Unità e ruoli: Admin Persone o Admin App per unità, Admin App per una singola app, oppure Proprietario. I due ruoli di Admin si sommano sulla stessa persona. I ruoli dentro le app (per esempio responsabile o magazziniere) sono un'altra cosa: restano com'erano e si danno nella pagina dell'app, scheda Accessi e ruoli.

Il portale saluta chi è entrato («Buongiorno, Anna.», con l'ora del suo computer e la prima parola del suo nome) e mostra le sue app come tessere, con una fascia del colore di ogni app; nel layout Elenco della home le app tengono il quadratino colorato. La home si sistema dalla console, in Home del portale.

04 /Più clienti su un motore: le unità

Un'unità è un gruppo chiuso di persone, gruppi e app: per esempio un cliente, un gruppo di lavoro o una sede. Con le unità un solo motore può servire più clienti, e ognuno vede solo le sue cose. All'inizio, e dopo l'aggiornamento dalla 0.7.5, c'è una sola unità, «Tutta l'azienda», e ci stanno tutti: se non ne crei altre, per chi usa Pyrite non cambia niente.

Chi vede che cosa

Che cosa il motore non fa vedere a chi è di un altro cliente

Quello che è di un altro cliente «non esiste»: la risposta è la stessa che si riceve per un indirizzo sbagliato. A deciderlo è il motore, non la pagina: nessuna risposta porta dati che poi la pagina nasconde. Vale per:

Chi amministra senza essere Proprietario non legge mai nome ed email dei Proprietari: al loro posto c'è la parola «Proprietario». Resta uguale per tutti i clienti il titolo, il logo e le tessere in più della home.

Come si crea un'unità

Pagina Unità (solo il Proprietario; la voce è nella barra), Nuova unità, un nome. Il nome di un'unità è unico. Un'unità si elimina solo se è vuota. «Tutta l'azienda» si può rinominare ma non eliminare.

Rinomina «Tutta l'azienda» quando crei le unità dei clienti. Resta l'unità di partenza: ci stanno le persone, i gruppi e le app che nessuno ha spostato, e il suo nome non dice più la verità. È anche l'unità delle app che si vedono nel portale prima dell'accesso. Dalla pagina Unità dagli un nome che dica che cosa contiene davvero.

Come si sposta una persona o un'app

Una persona ha sempre almeno un'unità, e un gruppo e un'app ne hanno sempre una: se un salvataggio (per esempio dalla scheda nativa) lascia il campo vuoto, torna «Tutta l'azienda».

05 /Doppia autenticazione

È un codice a sei cifre, preso da un'app sul telefono, che si scrive dopo email e password. La possono attivare le persone che entrano nella console (Proprietari e Admin). I codici dipendono dall'orologio: l'ora del server e quella del telefono devono essere giuste.

Come si attiva

  1. Dal Profilo, dalla rete locale (non da internet), riquadro Doppia autenticazione, Attiva: scrivi la password.
  2. Con un'app per i codici sul telefono inquadra il QR (o scrivi a mano la chiave).
  3. Metti da parte i dieci codici di riserva (copia, scarica o stampa).
  4. Scrivi il primo codice e spunta Li ho messi da parte.

Tutte le sessioni si chiudono: si rientra con password e codice. Il codice appena usato non vale più: si aspetta il prossimo, al più 30 secondi.

Come si entra

Se si perde il telefono

  1. Se hai un codice di riserva: entra con quello e, dal Profilo, togli la doppia autenticazione (o rifai i codici). Per rifare i codici serve il codice del telefono: chi il telefono l'ha perso la toglie (lì un codice di riserva vale) e la riattiva.
  2. Altrimenti un Proprietario apre la persona nella pagina Persone e preme Togli la doppia autenticazione. Da lì non la si toglie a sé stessi.
  3. Se è un Proprietario a essere rimasto fuori e non ce n'è un altro, dal server: pyrite.exe owner two-factor-off EMAIL, a motore acceso o spento. Funziona solo per un Proprietario.

Chi può toglierla a chi

chia chicome
la persona stessaa sé stessadal Profilo, con la password e un codice
un Proprietarioa un'altra personapagina Persone, Togli la doppia autenticazione
chi ha accesso al servera un Proprietariocomando pyrite.exe owner two-factor-off EMAIL

Un Admin che non è Proprietario non può toglierla a nessun altro.

La chiave e i backup

I codici sono protetti con una chiave che sta in control\doppia. Su Windows il file della chiave si apre solo su quel computer. Se il motore viene spostato su un altro computer, se Windows viene reinstallato o se il file della chiave si perde, chi aveva la doppia autenticazione risulta «da riattivare» e non entra più nella console finché non gli viene tolta: all'avvio lo storico dice chi è. Un Proprietario si libera con il comando dal server, poi la toglie agli altri dalla pagina Persone, e ognuno la attiva di nuovo. Per questo la cartella control\doppia va tenuta insieme al resto dei dati del motore in ogni copia che fai a mano.

Con update-restore

Il piano di update-restore (vedi Aggiornare dalla 0.7.5) dice chi perde la doppia autenticazione tornando indietro, a chi torna quella di allora e chi resta fuori perché la chiave del server è stata rifatta dopo il punto di ripristino.

06 /Persone e gruppi

dovePersone, Gruppi

Nelle parti che seguono, dove si legge «un Admin» si intende l'Admin «come nella 0.7.5». L'Admin Persone e l'Admin App hanno limiti più stretti: che cosa può fare e che cosa vede ogni livello è scritto in La console e i livelli.

Aggiungere una persona

«Nuova persona». Per un Proprietario apre la scheda di PocketBase: servono nome, email e una password iniziale, che deve rispettare le regole (almeno una maiuscola, una minuscola, un numero, un carattere speciale e la lunghezza minima delle Impostazioni del motore); poi, nella stessa scheda, sceglie il livello. Per un Admin apre una pagina del motore: nome, email e password iniziale, scritta da lui con le stesse regole oppure lasciata vuota e generata dal motore, che la mostra una volta sola; la persona ha il livello Utente. Con email e password la persona entra nel portale e al primo accesso sceglie una password sua: il cambio obbligatorio si accende da solo quando l'amministratore dà una password, e si può spegnere nella scheda («must_change_password»).

Cambiare nome, email e password

Si fa dalla scheda della persona: un Proprietario per tutti, un Admin per le persone di livello Utente. Una password data così è provvisoria: al primo accesso la persona dovrà sceglierne una nuova. Ognuno può cambiare la propria password dal portale, con «Cambia password». Se l'amministratore alza la lunghezza minima, chi ha una password più corta la cambia al prossimo accesso. Per chi dimentica la password vedi Password e recupero.

Disattivare una persona

Blocca subito l'ingresso nel portale, nella console e in tutte le app, anche per chi in quel momento sta lavorando. Quando qualcuno se ne va è il modo più rapido per chiudere tutti i suoi accessi in una volta. Un Admin può disattivare e riattivare le persone di livello Utente; eliminare una persona lo può fare solo un Proprietario.

Gruppi

Un gruppo raccoglie persone che hanno bisogno degli stessi accessi, per esempio un team. Dai l'accesso al gruppo una volta e vale per tutti i membri, anche per quelli che aggiungerai in seguito. Un Proprietario crea e cambia tutti i gruppi. Un Admin crea gruppi e ne cambia i membri solo se il gruppo dà accesso soltanto ad app gestite da lui; gli altri gruppi li vede in sola lettura, ma a qualsiasi gruppo può dare o togliere l'accesso alle sue app.

Importare persone, gruppi e accessi da Excel

Nella pagina Persone il pulsante «Importa da Excel» (Proprietari, e Admin che possono creare persone) apre «Importa persone e gruppi»: serve a caricare in una volta un team o un'azienda.

  1. Scarica il modello (nella tua lingua): quattro fogli. Gruppi: Nome (obbligatorio) e Descrizione. Persone: Nome e cognome; Email (obbligatoria, una riga per persona); Livello (Utente o Admin; vuoto = Utente; Proprietario mai; Admin solo se importa un Proprietario); Gruppi (separati da punto e virgola, quelli che non esistono si creano); Attiva (sì o no; vuoto = sì; no = creata disattivata). Accessi: Gruppo, App (id, nome breve o nome) e Ruolo (facoltativo). Istruzioni.
  2. Carica il file (Excel .xlsx o il vecchio .xls, fino a 10 MB; al massimo 5.000 persone e 1.000 gruppi). Un CSV vale come foglio Persone.
  3. L'anteprima dice quante righe sono nuove, quante sono già presenti e gli errori, con il numero di riga. Un errore blocca tutto.
  4. Conferma: tutto o niente, con una barra di avanzamento. È solo aggiunta: chi esiste già non cambia, nessuno esce da un gruppo o si disattiva.
  5. Le password provvisorie (da cambiare al primo accesso) stanno in un file Excel che si scarica una volta sola, entro 10 minuti: non restano in nessun altro posto. Se si perde il file, la password si rifà dalla scheda della singola persona. Una persona nuova non riceve email: le password vanno comunicate a mano.

Un Admin può aggiungere solo persone di livello Utente, mettere persone in gruppi che può modificare e dare accessi solo alle app che gestisce. Il ruolo dentro un'app non è dell'accesso del gruppo ma della persona: la colonna Ruolo si controlla (l'app deve avere quel ruolo) e, a import finito, si dà alle persone nuove del gruppo se l'app è accesa; i ruoli che non si sono potuti dare (app spenta) sono elencati nell'esito, da dare dalla scheda «Accessi e ruoli» dell'app. L'esito finisce nello Storico del motore come un solo evento di riepilogo, senza password.

Le modifiche che un Admin fa a persone e gruppi finiscono nello Storico del motore, con il suo nome.

07 /Dare e togliere accessi

dovePersone o Gruppi, riquadro «Accesso alle app» nella scheda

Un accesso dice soltanto che una persona può entrare in un'app. Si dà direttamente a una persona oppure a un gruppo, e in quel caso vale per tutti i membri: nel riquadro «Accesso alle app» c'è un interruttore per ogni app. Una persona può avere l'accesso sia diretto sia tramite uno o più gruppi: le basta averne uno per entrare. Le app aperte a tutti non hanno accessi da gestire.

Un Proprietario dà e toglie l'accesso a tutte le app; un Admin solo alle app che gestisce, e mai a un Proprietario.

La scheda «Accessi e ruoli» della pagina dell'app mostra chi può entrare e come, ma non lo cambia: per cambiarlo si torna alla scheda della persona o del gruppo.

Togliere un accesso

Ha effetto subito, su tutte le app, anche per chi è già dentro: il motore controlla sessione e accesso a ogni richiesta.

08 /I ruoli dentro le app

dovepagina dell'app, scheda «Accessi e ruoli»

Il ruolo, per esempio «responsabile» o «magazziniere», è il livello di una persona dentro un'app e si gestisce lì. Non dipende dai gruppi, che decidono solo chi entra, né dal livello nella console.

Sotto l'elenco, «Altri utenti dentro l'app» mostra gli utenti che esistono nel database dell'app ma non hanno l'accesso dal centro: la porta d'ingresso non li fa entrare.

09 /Persone già presenti nelle app

dovePersone, comando «Importa dalle app» (solo Proprietari)

Serve solo quando nelle app ci sono già utenti che non sono nella rubrica, per esempio app che avevano un loro login prima di passare al motore. Partendo da un motore vuoto e da app nuove non serve.

  1. Apri Persone e scegli «Importa dalle app».
  2. Il motore legge gli utenti che esistono dentro ogni app e porta nella rubrica quelli che mancano, con l'accesso diretto alle app in cui c'erano già. Il loro ruolo dentro le app resta com'era.
  3. Sotto il riepilogo ci sono le password iniziali delle persone appena create. La console le mostra una volta sola: copiale subito e consegnale di persona o con un canale riservato.
  4. Rileggi l'elenco e togli account di prova, doppioni e persone che non usano più le app.

10 /Che cosa può fare un'app

Gli script di un'app (le cartelle pb_hooks e pb_migrations) girano in un recinto: il motore impedisce loro di fare molte cose. Non servono scelte da parte tua: questo capitolo dice che cosa aspettarsi.

Il limite, detto chiaro. Il recinto riduce molto quello che lo script di un'app può fare, ma è una difesa dentro il programma: lo script gira nello stesso processo del motore di quell'app, con lo stesso utente di Windows, e ogni strada va chiusa una per una. Contro uno script scritto apposta per uscirne la garanzia piena sarà far girare ogni app con un suo utente di Windows, che non può toccare i file delle altre nemmeno se esce dal recinto. Questo non c'è in questa versione; è previsto per una versione futura. Fino ad allora le app di clienti diversi sullo stesso motore vanno bene se gli script li scrive o li controlla chi gestisce il motore. Non caricare script scritti da qualcuno di cui non ti fidi contando solo sul recinto.

11 /L'icona vicino all'orologio

12 /Dove stanno le cose

Tutto resta nella cartella di pyrite.exe; il motore crea le cartelle al primo avvio.

cartellacosa c'è
control\pb_data\i dati del motore: persone con il loro livello, gruppi, chi entra in quale app, impostazioni, l'elenco delle app, i log e gli eventi del motore
control\pb_data\backups\i backup dei dati del motore (ogni notte alle 3:00; si tengono gli ultimi 7) e le copie fatte dalle versioni di prima prima di un aggiornamento del programma (pre_migrazione_…zip, da cancellare a mano; un aggiornamento fa un punto di ripristino in control\aggiornamenti\)
apps\<app>\una cartella per ogni app: app.json (la sua scheda), release\ (il suo codice)
apps\<app>\state\pb_data\i dati dell'app (il suo database e i file caricati)
apps\<app>\state\pb_data\backups\i backup dell'app (ogni notte alle 3:00 per le app accese; si tengono gli ultimi 7; quelli a mano dalla scheda Backup dell'app)
apps\<app>\logs\worker.logl'output del processo dell'app (anche nella console: pagina dell'app, scheda Stato)
logs\engine.logi messaggi del motore; fino a 10 MB, si tengono i 3 file precedenti
control\aggiornamenti\i punti di ripristino degli aggiornamenti del motore (si tengono gli ultimi 2) e le copie messe da parte prima di tornare a una versione precedente (cartelle ritorno_…: il motore non le toglie mai, e la pagina Backup del motore le elenca; toglile a mano quando non servono più). Contengono dati personali (persone, impronte delle password, tutti i dati delle app): quando si devono cancellare i dati di qualcuno, vanno cancellati anche qui.
apps\<app>\logs\network.logle chiamate di rete degli script dell'app (indirizzo, dimensione, tempo: mai il contenuto); anche nella console, pagina dell'app, scheda Rete in uscita
archivio\le app archiviate dalla console, ognuna con tutti i suoi dati (pagina Archivio: ripristinale o eliminale per sempre, vedi La pagina Archivio)
control\copia_rete.jsoncom'è andata l'ultima copia dei backup sulla cartella di rete (la pagina e la Panoramica la leggono da qui; vedi Copia dei backup su una cartella di rete)
control\doppia\la chiave che protegge i codici della doppia autenticazione (vedi Doppia autenticazione)
control\biglietti\la chiave dei biglietti d'accesso al portale: non va copiata insieme ai backup del registro (vedi Aggiornare dalla 0.7.5)
control\passaggio-ruoli.txtil riepilogo scritto al primo avvio della 0.7.6: chi è Proprietario, chi è Admin e di quali app
control\pyrite.jsonle regole di rete del motore e il suo identificativo (vedi Regole di rete)
control\storico\lo storico del motore (storico.db) e, in copie\, le sue copie notturne; control\storico-fuori.jsonl tiene gli eventi che non si sono potuti scrivere lì (vedi Lo storico del motore)

Gli eventi si leggono nella console: i Proprietari li vedono tutti nello Storico del motore (barra laterale, vedi Lo storico del motore) e nei Log (in alto); gli Admin vedono gli eventi delle loro app nello Storico del motore, nella panoramica e nelle pagine delle app. La pagina di ogni app ha la scheda Log con le richieste arrivate all'app. Per una copia di tutto a mano, ferma il motore e copia l'intera cartella.

13 /Caricare e avviare un'app

Le app arrivano come file zip (per esempio da un agente di IA che segue lo standard per gli agenti).

  1. Nella console apri Carica app nella barra laterale e scegli (o trascina) lo zip.
  2. Il motore lo controlla a passi. Tre passi sono controlli veri (il pacchetto, la scheda app.json, la struttura delle cartelle); due, «Controllo di sicurezza» e «Compatibilità con lo standard», in questa alpha sono segnati demo: il loro punteggio è simulato. Controlla tu l'app prima di avviarla. Nel passo app.json il riepilogo elenca anche, per informazione, gli strumenti che l'app apre alle sue pagine e per chi, e gli indirizzi di rete che vuole raggiungere: leggili prima di installare. Un pacchetto con rotte sotto /api/tools/ si rifiuta: quel percorso è del motore. L'id di un'app non può essere un nome del motore (console, archivio…) né il nome di un dispositivo di Windows (con, nul, com1…). I file che si chiamano pyrite-archivio.json o pyrite-ripristino.json, accanto ad app.json, non si installano (il riepilogo lo dice): quei nomi il motore li tiene per l'Archivio.
  3. Leggi il riepilogo e le note di consegna, poi premi Installa. L'app si installa spenta e non compare ancora nel portale.
    • Caricata da un Proprietario: si può avviare subito.
    • Caricata da un Admin: è in attesa di approvazione e la gestisce l'Admin. Finché un Proprietario non la approva, niente la avvia e non è nel portale. I Proprietari la trovano in App in attesa di approvazione nella panoramica e nella pagina dell'app (chi l'ha caricata e quando): la controllano e premono Approva. Per rifiutarla, un Proprietario preme Rifiuta (vedi App in attesa di approvazione).
  4. Nella pagina dell'app premi Avvia. Poi dai l'accesso a persone o gruppi (Persone, Gruppi) e, se l'app ha ruoli, assegnali nella scheda Accessi e ruoli. Guarda anche le schede Strumenti per le pagine (che cosa possono usare le pagine, e chi; lì vedi anche i Lavori partiti dalle pagine, che puoi Annullare) e Rete in uscita (gli indirizzi che l'app raggiunge). In un'app pubblica che ha bisogno di utenti (per esempio chi può scrivere), creali nella scheda Dati (vedi Iscrizioni alle app).

Per provare c'è un'app di esempio, example-parts-pricelist.zip: è quella dello standard per gli agenti, con accesso e due ruoli, porta 8105.

Un Proprietario può installare un'app anche copiando la sua cartella in apps\ e premendo Rileggi cartelle.

Carica app e la porta

La porta scritta in app.json è una richiesta. Nel riepilogo di Carica app:

App in attesa di approvazione

Aggiornare un'app installata

Una versione nuova di un'app arriva come uno zip con lo stesso identificativo. Parti da Carica app, oppure da Aggiorna da zip nella scheda Configurazione dell'app (da lì lo zip di un'altra app si rifiuta).

  1. Il motore fa i controlli di sempre e poi mostra che cosa cambia rispetto alla versione installata: versioni, campi di app.json, migrazioni nuove. Non si tocca ancora niente. Una migrazione rinominata o tolta, e un app.json nuovo che allarga i permessi (accesso che diventa pubblico, indirizzi nuovi in network, toolAccess o tools nuovi, ruoli nuovi), sono un avviso forte: leggilo, e vai avanti solo se sei sicuro. Un Proprietario approva proprio il pacchetto che vede nel riepilogo: se intanto un Admin ne carica un altro, la pagina mostra il riepilogo nuovo. Un pacchetto con una cartella state si rifiuta: i dati non si sostituiscono mai.
  2. Un Proprietario preme Aggiorna adesso. Un Admin che gestisce l'app lo manda per l'approvazione: la versione in uso continua a girare finché un Proprietario non lo approva o lo rifiuta nella stessa pagina.
  3. Tutto o niente: l'app si ferma (i lavori pianificati in corso si interrompono, come con un riavvio), si fa una copia di sicurezza di release, app.json e dei dati dell'app (tutta la cartella state, senza i temporanei) in control\aggiornamenti_app\<app>, dove gli script dell'app non arrivano, si sostituiscono i file, la versione nuova parte, applica le migrazioni e deve rispondere. Un'app che era ferma parte solo per questo, poi torna ferma.
  4. Se qualcosa non va, tutto torna da solo com'era, dati compresi (controllato con le impronte), la versione di prima riparte e la pagina dice perché. Se il motore o il PC si spengono a metà, al prossimo avvio il motore rimette la versione di prima, prima di avviare le app, e lo scrive negli eventi.

Dopo, un Proprietario può premere Torna alla versione di prima nella stessa scheda, scrivendo l'identificativo dell'app. I dati scritti dopo l'aggiornamento per l'app si perdono: prima lo stato di quel momento si copia da parte in una cartella da_parte_…, che chi gestisce Pyrite può leggere a mano. Per ogni app il motore tiene la copia dell'ultimo aggiornamento riuscito e l'ultima copia messa da parte (al più due cartelle, ognuna grande come i dati dell'app). Anche la porta torna quella che aveva prima dell'aggiornamento: se nel frattempo l'hai cambiata dalla scheda Configurazione, dopo il ritorno va cambiata di nuovo da lì; il riepilogo che compare prima del ritorno lo dice. Contengono dati personali: per cancellare davvero i dati di una persona vanno cancellati anche lì, a mano.

Archiviare l'app. Le copie di sicurezza non entrano nella voce dell'archivio: vanno in control\aggiornamenti_app\_archiviate\<voce>, la pagina Archivio le mostra con la voce, e si eliminano quando elimini la voce. Dopo un ripristino dall'archivio Torna alla versione di prima non c'è più. Le copie di un'app la cui cartella non c'è più vanno da parte all'avvio del motore e finiscono negli eventi a ogni avvio, finché non le togli.

App ferma dopo un aggiornamento. Se la versione di prima non si è potuta rimettere (disco pieno, un file tenuto da un altro programma, una copia rovinata), l'app resta ferma con il segno control\aggiornamenti_app\<app>\in_corso.json e il motore riprova a ogni avvio. Togli la causa e riavvia il motore. Se non basta: a motore fermo, copia a mano release, app.json e state da file\apps\<app> della copia che il segno nomina, poi cancella in_corso.json. Senza il segno il motore non cancella più quella copia: lo scrive negli eventi a ogni avvio, e la togli tu quando l'app funziona. update-restore non parte finché c'è un segno: prima avvia il motore una volta.

14 /Modificare un'app

dovepagina dell'app, scheda Configurazione (solo Proprietari)

Si possono cambiare nome, responsabile, descrizione, accesso, versione, porta, limite di memoria, ruoli e livello base. La versione precedente della scheda resta salvata accanto come app.json.prima. Se cambiano porta, memoria, accesso o ruoli, l'app si riavvia da sola in pochi secondi; nel frattempo la sua porta risponde «si sta aggiornando». Lo stesso succede se modifichi app.json a mano e poi premi «Rileggi cartelle».

I ruoli funzionano solo se l'app ha un campo per il ruolo dei suoi utenti (auth.roleField nella scheda): se manca, la Configurazione lo segnala sotto il campo dei ruoli.

Nella stessa scheda ci sono i controlli consigliati dalla guida di PocketBase per la messa in produzione. Il limite di richieste si attiva con un clic.

Per aggiornare un'app da uno zip vedi Aggiornare un'app installata.

Aggiornare il codice di un'app a mano

  1. Fai un backup manuale dell'app.
  2. Sostituisci i file dentro apps\<id>\release. Non toccare state, dove stanno i dati.
  3. Riavvia l'app dalla sua pagina: le migrazioni nuove si applicano all'avvio. Poi controlla Stato e Log.

15 /Strumenti del motore

doveStrumenti; pagina dell'app, scheda Configurazione, riquadro «Strumenti del motore» (solo Proprietari)

Il motore offre alle app degli strumenti pronti per i lavori pesanti, che gli script dell'app usano senza programmi o librerie da aggiungere. Sono pronti otto strumenti: import ed export Excel e CSV, PDF, foto, numerazioni, storico delle modifiche, statistiche e lavori pianificati; restano «in programma» le email e le notifiche e le prenotazioni.

Per usare l'import dalla console non serve attivare niente: la scheda «Importa» c'è in ogni app con database.

16 /Importare dati da Excel o CSV

dovepagina dell'app, scheda «Importa» (Proprietari e Admin dell'app)

  1. Carica il file (Excel .xlsx o il vecchio .xls di Excel 97-2003, CSV oppure JSON — .json, .jsonl, .ndjson — fino a 100 MB; i file JSON al più 128 MB). I file con la password, quelli di Excel 95 e precedenti, quelli rovinati e i documenti di Word o PowerPoint con il nome .xls si rifiutano subito con un messaggio: riaprili con Excel e salvali come .xlsx. Un file Excel può avere al massimo 5.000.000 di testi diversi e 256 MB di testo: oltre, il motore risponde «troppo testo». Capita solo con file enormi; in quel caso dividi il file o salvalo come CSV.
  2. Scegli il formato. CSV: il separatore (di partenza il punto e virgola). Excel: il foglio e il modo, cioè solo dati (i dati partono dalla prima riga e le colonne si chiamano A, B, C…), con titoli (la prima riga dà i nomi delle colonne) oppure con intestazione: nell'anteprima scegli le righe da scartare in testa, la riga dopo dà i nomi e i dati partono da quella successiva.
  3. Controlla l'anteprima: colonne, tipi riconosciuti, prime righe, avvisi.
  4. Scegli la raccolta e controlla gli abbinamenti tra colonne e campi proposti dal motore. Con una chiave (per esempio la targa) un nuovo import aggiorna i record già presenti invece di duplicarli.
  5. Fai la prova: controlla tutto e non salva niente. Le righe con errori sono elencate con il numero di riga e il motivo.
  6. Importa. L'avanzamento resta a vista; alla fine c'è l'esito. Le impostazioni si possono salvare come ricetta da riusare con il file del mese dopo.

Ogni importazione resta nello storico della scheda, con chi l'ha fatta, e si può annullare: i record creati si tolgono e quelli aggiornati tornano come prima. Importazioni e annullamenti finiscono anche nello Storico del motore.

L'import scrive direttamente nel database dell'app

Valgono i controlli dei campi (obbligatori, formati, valori ammessi), ma non le regole automatiche che l'app applica quando una persona inserisce un record dalle sue pagine, come numeri progressivi, autore, stato o maiuscole. Questi valori vanno messi nel file o sistemati dopo. Fai sempre prima la prova, e un backup dell'app prima di un import grande.

Importare tutto il file

Nel passo «Destinazione» si sceglie «Una raccolta» oppure «Tutto il file», che è la scelta di partenza anche con un foglio solo. Con «Tutto il file» il motore guarda ogni foglio (o elenco, nel JSON) e propone:

La chiave che riconosce le righe già presenti il motore la sceglie da solo solo quando è sicura: un indice unico dell'app, oppure, in una raccolta senza collegamenti nel file (singoli o a più valori), un codice, una targa o un nome con valori tutti diversi e pieni. Per una raccolta collegata a un'altra (le righe di un ordine, gli articoli di una categoria) non la sceglie mai, così un import non aggiorna mai la riga di un altro ordine: un avviso suggerisce quella da scegliere a mano, per esempio «ordine + articolo», e con quella, reimportando lo stesso file, i record si riconoscono e si aggiornano (salvala nella ricetta). Una chiave che trova più record già presenti scarta la riga e dice perché, e così un collegamento che trova più record (due ordini «O-1»).

L'«Anteprima (non salva niente)» mostra, per ogni raccolta, cosa verrebbe creato, aggiornato, già uguale o scartato con il numero di riga, e dice per quanti secondi le altre scritture dell'app aspetterebbero. «Importa tutto» si accende dopo un'anteprima riuscita ed è tutto o niente, in due tempi: il controllo si fa fuori da ogni transazione e le scritture dentro una sola transazione, al più 50.000 righe (di tutti i fogli) e 60 secondi di scritture; oltre, non si salva niente e il motore dice di dividere il file o di importare una raccolta alla volta. Se una riga non va non si salva niente; «Carica comunque le righe buone» carica il resto.

«Ferma» interrompe un lavoro in corso: un import di più raccolte fermato non lascia niente («Import fermato: non è stato salvato niente»); per una raccolta sola i lotti già salvati restano e si tolgono con «Annulla».

«Annulla» nello storico toglie l'intero import, tutto o niente. Si ferma, senza toccare niente, e dice quali record (al più 20) se: record di altri sono collegati a quelli importati (per esempio un ordine scritto da una persona per un fornitore importato): non si forza mai; oppure se dei record sono cambiati dopo l'import: per questi c'è «Annulla comunque», con una conferma.

La scheda dice anche cosa permette l'app: «L'app lascia importare dalla console solo in: …» (campo import.consoleCollections di app.json, scritto da chi costruisce l'app; senza, la console importa come il server, in tutte le raccolte, e la scheda lo avvisa). Nell'elenco delle ricette compaiono anche quelle «pacchetto dell'app», che arrivano nella cartella release/import dell'app: si usano, non si cancellano. «Salva la ricetta» serve per rifare l'import con un clic il mese dopo.

Una cella vuota in una colonna di numeri non cancella il numero che c'è: un avviso dice che il valore è rimasto; scrivi 0 per azzerare. Per i file JSON: un elenco di oggetti, un oggetto con più elenchi (un «foglio» per elenco) o JSON Lines; le parti annidate si leggono con il punto (supplier.name).

«Prova import» per le persone

Nella home del portale, chi ha fatto l'accesso trova la tessera «Prova import»: carica un file e vede come verrebbe letto, con le stesse scelte di formato, senza importare niente. Il file sta in un deposito temporaneo del motore e si cancella da solo dopo due ore dall'ultimo uso. È utile per preparare un file prima di chiedere all'amministratore di importarlo.

17 /La home del portale

doveHome del portale (solo Proprietari)

A sinistra c'è l'anteprima della home, disegnata come la vedranno le persone; a destra le impostazioni. Il portale non cambia finché non premi «Salva».

Le app nuove compaiono da sole in fondo, o nella sezione «Altre applicazioni», finché non le sistemi. Nascondere una tessera cambia solo la home: l'app resta raggiungibile sulla sua porta e protetta dal suo accesso.

18 /Iscrizioni alle app: le decide chi gestisce Pyrite

Nessuna app lascia iscriversi da soli, nemmeno le pubbliche: chi gestisce Pyrite decide chi ha un utente in ogni app.

19 /La pagina Archivio

Un Proprietario archivia un'app dalla sua pagina, scheda Configurazione: il motore la ferma, copia tutta la sua cartella (codice, dati, utenti dell'app, backup) in archivio\, controlla la copia e solo dopo toglie l'app dal motore. La pagina Archivio (per i Proprietari) elenca le app archiviate: quando e da chi, lo spazio occupato, se la copia è stata controllata, chi poteva entrare allora, la versione del motore.

20 /Backup

doveBackup per tutte le app; pagina dell'app, scheda Backup, per una sola

Tieni una copia fuori dal server

I backup stanno sullo stesso disco delle app. Se quel disco si guasta, li perdi insieme ai dati. Puoi accendere la copia dei backup su una cartella di rete (un NAS): ogni giorno copia i backup su un altro disco, e la pagina Backup mostra l'ultima copia riuscita. Senza la copia di rete, scarica con regolarità quelli importanti e conservali altrove.

Il riquadro Aggiornamenti del motore della pagina Backup elenca i punti di ripristino che il motore fa quando si cambia pyrite.exe (control\aggiornamenti) e le cartelle ritorno_<data> che update-restore mette da parte prima di tornare indietro: contengono dati personali e i dati scritti nelle app dopo l'aggiornamento, e il motore non le cancella mai da solo. Si tolgono a mano quando non servono più.

21 /Ripristino

doveBackup, comando «Ripristina» sul backup scelto

Il ripristino lo esegue il motore, in quattro passi:

  1. ferma l'app;
  2. salva una copia dei dati attuali in apps\<id>\state\copia_prima_del_ripristino_<data>;
  3. mette al loro posto i dati del backup;
  4. riaccende l'app, se era accesa. Un'app fermata con «Ferma» resta ferma anche dopo il ripristino: la riaccendi tu con «Avvia».

I dati tornano com'erano al momento del backup. Quello che è stato scritto dopo resta solo nella copia di sicurezza.

Il motore tiene le ultime 3 copie di sicurezza per ogni app (da 1 a 50, in Impostazioni del motore → Backup e ripristini): le più vecchie le toglie solo dopo un ripristino riuscito, e ogni copia tolta è scritta nello Storico del motore. Le cartelle ritorno_ del ritorno a una versione del motore, invece, non si cancellano mai da sole (vedi sopra).

22 /Password e password dimenticata

23 /Regole di rete

La pagina della console Regole di rete (gruppo Sistema, solo per i Proprietari) raccoglie in un posto solo tutte le regole di rete del motore. Ogni sezione si salva da sola e dice se vale subito o dal prossimo avvio. Se non cambi niente, il motore si comporta come la 0.7.4. Le regole stanno nel file control\pyrite.json. pyrite.exe network status mostra le regole in uso; a motore fermo, pyrite.exe network reset torna ai valori della 0.7.4 (il file di prima resta in control\).

Dove ascoltano le app

Ogni app ha la sua porta. La porta può restare aperta su tutta la rete (come nella 0.7.4), ascoltare solo dentro il server (le persone arrivano all'app passando dal motore, con i nomi) o ascoltare su un indirizzo che scegli. Il cambio vale subito, senza riavviare: chi stava usando un'app finisce quello che faceva. Prima di salvare «solo dentro la macchina» la pagina avvisa che le altre persone perdono l'indirizzo nome:porta. Un indirizzo che sul server non c'è non si salva. Nella stessa sezione scegli da quale porta partono le app nuove.

Un nome per ogni app

Di serie le app si raggiungono con il nome del computer e una porta (http://SERVER:8105/). In Gli indirizzi delle app puoi scegliere invece un nome per ogni app, tutti sotto un dominio usato solo per Pyrite, per esempio app.esempio.it: il portale sta lì, e ogni app ha il suo nome sotto (prenota.app.esempio.it: l'id dell'app, oppure il nome scelto nella sua scheda Esposizione). Non scrivere il tuo dominio intero (esempio.it): il certificato unico per le app varrebbe per tutti i siti di quel dominio (posta, VPN, sito).

L'ingresso da internet

È spento finché non lo accendi. Le scelte sono Spento, Tunnel (per esempio Cloudflare), Porta aperta sul router o indirizzo pubblico e Un proxy che c'è già (nginx, IIS…).

Se internet arriva dove non deve. Se il router o un proxy manda per sbaglio il traffico di internet all'ingresso rete, Pyrite lo dice negli eventi, in Panoramica e nella pagina Regole di rete, con gli ultimi indirizzi visti. Avvisa e basta, non blocca niente: chi arriva da lì viene trattato come chi è nella rete locale. Sistema il router o il proxy.

Quali app si vedono da internet

Ogni app ha la sua scelta, Solo rete locale o Anche internet, nella scheda Esposizione della sua pagina. Le app nuove partono «Solo rete locale» (tranne quando gli utenti arrivano solo da internet).

Le due domande e il comando pyrite.exe network setup

Due domande scelgono i valori di partenza: Dove sta il server e come ci arrivi (Da una rete privata oppure Solo da internet, per una VPS) e Da dove arrivano gli utenti (Dalla rete locale, Da internet oppure Da tutte e due, app per app). Le risposte scelgono solo i valori di partenza, e Pyrite mostra cosa cambierebbe prima che tu li applichi (Mostra cosa cambierebbe, poi Applica queste regole); dopo cambi ogni voce da sola. Si rispondono al primo avvio, dalla pagina (Rifai le domande) o, su un server senza schermo, da un terminale con pyrite.exe network setup (a motore fermo; su Windows da cmd scrivi start /wait pyrite.exe network setup, oppure dai le opzioni e --yes: network setup -h le elenca).

24 /Il firewall di Windows

Perché gli altri computer aprano il portale e le app, il firewall di Windows deve lasciare entrare pyrite.exe. Pyrite ora legge com'è il firewall, lo mostra e può creare la regola. Usa una sola regola per il programma (in entrata, reti private e di dominio), non una per porta: copre il motore, ogni app e le app di domani. Si chiama Pyrite (pyrite-…), con il nome del servizio.

Quando si crea la regola

Il riquadro «Firewall di Windows» nelle Regole di rete

In cima alla pagina Regole di rete il riquadro dice in una frase com'è il firewall per Pyrite:

«Lascia entrare Pyrite» e «aperta» vogliono sempre dire «se la rete di questo computer è segnata come privata o di dominio». Sotto lo stato il riquadro elenca le app accese in rete, ognuna con la sua porta: aperta, chiusa dal firewall o non si sa. Il tasto Apri Pyrite sulla rete locale c'è solo se sono vere tutte queste cose: lo stato è «Nessuna regola» o «Solo alcune porte», chi guarda è il Proprietario, la pagina è aperta dal computer del motore, Pyrite gira con l'icona (non come servizio), c'è qualcuno davanti allo schermo, Pyrite non è stato avviato come amministratore (Windows non chiederebbe niente) e Windows su questo computer non è impostato per dare i diritti di amministratore senza chiedere (se Pyrite non riesce a leggere l'impostazione, il tasto non c'è). Quando lo premi e confermi, Windows mostra la sua richiesta, ed è per netsh.exe, un programma di Windows, non per pyrite.exe: Pyrite non gira mai con i diritti di amministratore per via del tasto. Una richiesta alla volta; nessuna finestra nera. L'esito (regola creata, non creata, richiesta rifiutata) finisce nello Storico entro due minuti; poi ricarica la pagina. Negli altri casi il riquadro non mostra il tasto ma il comando da dare a mano sul server (pyrite.exe firewall open come amministratore): quando Pyrite gira come servizio, quando nessuno è davanti allo schermo, quando Pyrite è già avviato come amministratore, quando Windows dà i diritti di amministratore senza chiedere; negli stati Blocco e Vietato nemmeno il comando basta.

I limiti

25 /Accesso: un solo accesso, tentativi sbagliati, la console

Un solo accesso anche con un nome per app

Quando ogni app ha il suo nome (per esempio prenota.app.esempio.it), chi apre un'app senza essere entrato passa dal portale, scrive la password una volta e torna da solo all'app. Il passaggio usa un codice che vale una volta sola, per un minuto, solo per quell'app e solo nel browser che l'ha chiesto. Nessun cookie vale per tutto il dominio. Con nome e porta (come di solito) non cambia niente.

Più motori sullo stesso server

Ogni motore ha i suoi cookie, così due motori sullo stesso server (su porte diverse) non si buttano più fuori a vicenda. Chi era entrato prima dell'aggiornamento resta dentro. Attenzione: una cartella del motore copiata così com'è si porta dietro il suo identificativo, e le due copie sullo stesso server tornano a buttarsi fuori.

Tentativi sbagliati

Il motore conta le password sbagliate per ogni indirizzo vero, anche dietro un tunnel. Chi sbaglia da internet non blocca più chi è nella rete locale.

La console solo da alcuni indirizzi

In Regole di rete, sezione La console, puoi dire da quali indirizzi o reti si apre la console (per esempio la VPN, oppure solo il server stesso). Vuoto vuol dire da tutta la rete. Nell'elenco ci deve essere anche l'indirizzo da cui la stai usando adesso. Da un altro indirizzo la pagina d'accesso lo dice subito, prima della password. Il portale resta aperto a tutti.

La console si chiude da sola

Dopo 30 minuti senza uso la console richiede la password (e il codice, per chi ha la doppia autenticazione). La pagina torna da sola all'accesso e scrive «Sessione chiusa dopo N minuti senza uso». Una pagina lasciata aperta su uno schermo che nessuno tocca non tiene viva la sessione: conta solo quello che fa la persona.

26 /HTTPS e certificati

Senza un certificato il motore lavora in HTTP: password e dati viaggiano in chiaro nella rete, e la Panoramica lo dice. Da Impostazioni del motore → Certificati (solo i Proprietari, nelle due impaginazioni della console) si accende HTTPS. Basta un certificato per il motore e per tutte le porte delle app: un certificato vale per un nome, non per una porta. Gli indirizzi di oggi (http://SERVER:8080/, http://SERVER:8105/, i segnalibri) continuano a funzionare: il motore li rimanda a https:// sulla stessa porta. I processi delle app restano in HTTP in chiaro su 127.0.0.1, dentro il server. In cima alla pagina: il modo, i nomi coperti, la scadenza, chi ha firmato, e Controlla (una prova vera di ogni porta). Prima di tutto scrivi i nomi e gli indirizzi con cui le persone raggiungono il server: il nome del computer, il nome completo nel dominio, l'indirizzo IP.

  1. a. Nessun certificato (HTTP): il motore continua a lavorare in HTTP. Va bene solo per una prova.
  2. b. Richiesta per la CA aziendale (Servizi certificati di Active Directory, AD CS, o un'altra CA).
    1. C'è una CA? Su un PC del dominio, nel Prompt dei comandi: certutil -dump (o certutil -TCAInfo). Una voce Config: con un server e il nome di una CA vuol dire sì. Se non trova niente, usa la CA interna (d).
    2. Crea la richiesta: la chiave privata nasce sul server e non esce mai. Scarica la richiesta (pyrite.csr).
    3. Falla firmare, su un PC del dominio, con un utente che può chiedere certificati: certreq -submit -attrib "CertificateTemplate:WebServer" pyrite.csr pyrite.cer (una finestra chiede quale CA). Se resta in attesa di approvazione: l'amministratore della CA la approva, poi certreq -retrieve RequestId pyrite.cer. Oppure con la pagina web della CA: http://SERVER-CA/certsrv → Richiedi un certificato → richiesta di certificato avanzata → incolla il testo di pyrite.csr → modello Server Web → Invia → Codificato Base 64 → Scarica certificato (o la catena, .p7b).
    4. Carica il .cer, .crt, .pem o .p7b ricevuto: il motore controlla che sia della richiesta e che copra i nomi, poi lo mette subito in uso. I PC del dominio si fidano già di una CA aziendale: niente da distribuire.
  3. c. Carica un file: un .pfx/.p12 con la sua password (sia quelli che Windows esporta oggi, AES-256 con SHA-256, sia quelli vecchi, 3DES o RC2 con SHA-1), oppure .pem (certificato e chiave, in un file o in due). Il motore controlla che la chiave sia quella del certificato, che valga oggi, che sia per un server web, che la chiave sia abbastanza forte e che copra i nomi; se ne copre solo una parte chiede prima di usarlo. La password serve solo ad aprire il file e non si scrive da nessuna parte. Se un .pfx viene rifiutato lo stesso: openssl pkcs12 -in certificato.pfx -out pyrite.pem -noenc e carica il .pem.
  4. d. CA interna creata da Pyrite: Crea la CA interna crea un'autorità di certificazione e il certificato del server (con i nomi, più localhost e 127.0.0.1) senza accendere HTTPS: prima distribuisci la CA sui PC, poi premi Accendi HTTPS. Il certificato del server dura 397 giorni e si rinnova da solo 30 giorni prima della scadenza, con la stessa CA. La CA può firmare solo certificati di server web e solo per questi nomi e indirizzi esatti (per un nome nuovo serve una CA nuova, e una CA nuova va ridistribuita a tutti i PC: perciò prima scegli tutti i nomi, quelli del motore e, se li vuoi, il dominio delle app, e solo dopo crea la CA): chi ne rubasse la chiave non potrebbe spacciarsi per siti di internet o per altri server del dominio, né firmare programmi. Sostituendo la CA (Nuova CA), la chiave di quella di prima si cancella subito; il suo certificato pubblico resta come riferimento (toglilo dai PC). Distribuisci pyrite-ca.cer sui PC con un criterio di gruppo:
    1. scaricalo dalla pagina (Scarica il certificato della CA);
    2. su un server con Gestione Criteri di gruppo (gpmc.msc): crea (o modifica) un oggetto Criteri di gruppo collegato all'unità organizzativa dei PC, o al dominio;
    3. Configurazione computer → Criteri → Impostazioni di Windows → Impostazioni sicurezza → Criteri chiave pubblica → Autorità di certificazione radice attendibili → tasto destro → Importa → pyrite-ca.cer → Avanti fino alla fine;
    4. i PC lo ricevono al prossimo aggiornamento dei criteri (al riavvio, o entro circa 90 minuti; subito con gpupdate /force);
    5. controlla su un PC: certlm.msc → Autorità di certificazione radice attendibili → Certificati: c'è la CA di Pyrite, con l'identificazione personale che mostra la pagina.
    A mano, su un PC fuori dal dominio: doppio clic su pyrite-ca.cer → Installa certificato → Computer locale → Colloca tutti i certificati nel seguente archivio → Autorità di certificazione radice attendibili. Edge e Chrome usano i certificati di Windows; anche Firefox nelle versioni recenti (altrimenti importalo nelle sue impostazioni).

Cosa vedono le persone la prima volta. Con un certificato di cui i PC si fidano (CA aziendale, o CA interna già distribuita): il lucchetto e nient'altro; i vecchi indirizzi http:// passano da soli a https://, e le persone rientrano una volta nel portale (l'accesso fatto con l'indirizzo in chiaro non passa). Con la CA interna non ancora sui PC il browser dice che la connessione non è privata: prima distribuisci la CA, poi accendi HTTPS, e non insegnare a cliccare oltre l'avviso. Chi arriva con un nome che il certificato non copre (per esempio il nome corto, quando nel certificato c'è solo quello completo) vede l'avviso: la pagina Certificati e la Panoramica elencano quei nomi.

Scadenze. Il motore controlla ogni giorno: in Panoramica e negli eventi a 30, 14, 7 e 1 giorno dalla scadenza; un certificato scaduto si vede in rosso. Non si spegne niente da solo.

Uscita d'emergenza. Se l'HTTPS è configurato male e la console non si apre dalla rete: dal server stesso la console si apre sempre in HTTP in chiaro su http://127.0.0.1:8080/console/. Se non basta nemmeno questo: ferma il motore (icona → Esci) e in una finestra dei comandi nella cartella scrivi pyrite.exe certificates off (pyrite.exe certificates status dice com'è impostato). Al prossimo avvio il motore lavora in HTTP; il certificato resta, e HTTPS si riaccende dalla pagina. Se HTTPS è acceso ma il certificato non si legge (per esempio dopo aver spostato il motore su un altro computer), o il file dello stato dei certificati è rovinato, dalla rete le app non rispondono in chiaro (chiuso per difetto): mostrano una pagina che dice di avvisare chi gestisce Pyrite. Con il file dello stato rovinato la pagina offre Ripara lo stato (tiene una copia del file rovinato e ricostruisce lo stato dalle cartelle, CA interna compresa); lo ripara anche certificates off. Tornando a HTTP le persone rientrano con la loro password: in HTTPS il cookie dell'accesso ha un altro nome (__Host-) e non è d'intralcio. Sul server stesso l'icona e la finestrella aprono sempre http://127.0.0.1, quindi lì nessun avviso del certificato.

Dove stanno le chiavi. In control\certificati\. Quella cartella la aprono solo SYSTEM, gli Administrators e l'account con cui gira il motore (i permessi li mette il motore, senza ereditare quelli della cartella del motore); se poi il motore gira con un altro account, dagli il controllo della cartella (icacls) o rifai il certificato. Le chiavi sono anche protette con DPAPI di Windows di questo computer: questo protegge dalla copia dei file su un altro computer, non dagli altri utenti di questo (a quello pensano i permessi della cartella). Nessuna rotta del motore le serve; non sono negli eventi, nei log, nei backup né nel punto di ripristino dell'aggiornamento del motore, e un aggiornamento del motore o update-restore non le toccano. Motore spostato su un computer nuovo: rifai il certificato (con la CA interna, una CA nuova da ridistribuire). HSTS è spento di serie; acceso (pagina, Altro), i browser che lo vedono rifiutano l'HTTP in chiaro per quel nome, su tutte le porte, per 180 giorni, anche dopo certificates off. Per tornare a HTTP dopo HSTS: spegni HSTS e lascia HTTPS acceso qualche giorno; per 180 giorni il motore dice ai browser che passano in HTTPS di dimenticare la regola.

27 /Let's Encrypt, Cloudflare e più certificati

Tutto questo sta nella pagina Certificati (HTTPS e certificati), per i Proprietari.

Più di un certificato

Pyrite può tenere più certificati e sceglie da solo quello giusto per ogni nome: prima il nome esatto, poi quello con l'asterisco, altrimenti quello «di serie». Per aggiungerne uno: Certificati → Carica un file → Aggiungilo accanto a quello di serie, per i suoi nomi. Nella stessa pagina scegli quale è quello di serie (Usalo come certificato di serie) e togli quelli che non servono. Senza certificati in più non cambia niente.

Un certificato unico per le app

Un certificato *.app.esempio.it vale per tutte le app sotto app.esempio.it (prenota.app.esempio.it, ordini.app.esempio.it…), su un solo livello, e i nomi delle singole app non finiscono nei registri pubblici dei certificati. Lo puoi avere da Let's Encrypt (qui sotto), dalla CA aziendale (scrivi *.app.esempio.it tra i nomi del motore) o dalla CA interna: con i nomi accesi la CA interna copre anche il dominio delle app e i nomi del portale. Se la CA è stata creata prima, la pagina dice che ne serve una nuova, da ridistribuire ai PC.

Let's Encrypt con Cloudflare

È la strada consigliata; vale anche per le app usate solo nella rete locale.

  1. Certificati → Let's Encrypt e il DNS → apri il conto di Let's Encrypt (Apri il conto: accetta le condizioni d'uso; l'email è facoltativa).
  2. Metti la chiave di Cloudflare (Chiave di Cloudflare per il controllo nel DNS, poi Prova e salva). La chiave minima: su Cloudflare, Il mio profilo → Token API → Crea token → Modifica DNS della zona (Zona · DNS · Modifica), solo la zona del tuo dominio e, se possibile, con il filtro sull'indirizzo IP pubblico del server. Funziona anche una chiave del conto. Pyrite la prova subito (scrive e toglie un record di prova) e poi non la mostra più: se ne vede solo la fine. Resta solo su questo server, protetta come le chiavi dei certificati; se il motore si sposta su un altro computer va rimessa.
  3. Certificati da Let's Encrypt → Chiedi il certificato (di serie il certificato unico per le app più il portale). La pagina segue i passi mentre succedono.

Per più separazione: un dominio a parte solo per i controlli e, nel DNS del tuo dominio, un CNAME _acme-challenge.app.esempio.it verso _acme-challenge. seguito dal dominio dei controlli; con il DNS interno diviso, lo stesso CNAME anche nel DNS interno. Prima della prima richiesta vera Pyrite fa un giro con l'ambiente di prova di Let's Encrypt, così un errore non consuma i limiti. Il conto «di prova» serve solo a provare: i suoi certificati non si mettono in uso.

Let's Encrypt con la porta 443

Senza Cloudflare, solo con la porta aperta verso Pyrite: il router manda la 443 pubblica all'ingresso internet di Pyrite (Regole di rete, porta aperta) e Pyrite risponde da sé al controllo (Chiedi con la porta 443). Fa un certificato per ogni nome su internet (il portale e le app aperte a internet), senza asterischi; con un tunnel o un proxy serve il DNS. Pyrite non usa la porta 80.

Rinnovo e avvisi

L'uscita verso internet

Let's Encrypt e Cloudflare si raggiungono in HTTPS (porta 443 in uscita). Se dalla tua rete si esce con un proxy, va messo nella variabile d'ambiente HTTPS_PROXY dell'utente con cui gira Pyrite. Il controllo che il record si sia diffuso usa il DNS (porta 53 in uscita, verso i server di Cloudflare): se è chiusa, Pyrite aspetta un minuto e va avanti.

Tunnel o proxy davanti

Se l'HTTPS da internet lo fa il tunnel (per esempio Cloudflare) o un proxy, la Panoramica lo dice al posto dell'avviso «sei in HTTP». Per proteggere anche la rete locale si accende comunque l'HTTPS di Pyrite (per esempio con Let's Encrypt tramite il DNS).

Da internet con la porta aperta

Da internet solo certificati pubblici. Con la porta aperta sul router, Pyrite da internet non mostra mai il certificato della CA interna, né un certificato che contiene indirizzi interni (192.168…, 10…, 127.0.0.1) o il nome del computer senza dominio. Chi si collega senza un nome (per indirizzo IP, come fanno gli scanner di internet), con un nome che Pyrite non ha o con il nome di un'app solo interna non riceve nessun certificato: la connessione si chiude subito (un errore di connessione nel browser). Succede lo stesso per il portale e per le app aperte a internet, finché non hanno un certificato pubblico per il loro nome (Let's Encrypt, oppure uno caricato). Attenzione: se la CA interna copre quel nome, la pagina Certificati lo dà per coperto anche se da internet non si apre: controlla sempre da fuori. Così da internet non si leggono i nomi e gli indirizzi della rete interna. Dalla rete, da questo computer e con un tunnel o un proxy davanti non cambia niente.

Se qualcosa non va

28 /Lo storico del motore

Gli eventi del motore (chi ha acceso un'app, chi ha dato un accesso, chi è entrato nella console, chi ha cambiato un'impostazione…) stanno ora in uno storico tutto suo, il file control\storico\storico.db, fuori dal registro. Dalla console non si cancellano e non si cambiano, nemmeno dal Proprietario: svuotare i log tecnici o rimettere un backup del registro non li tocca.

29 /Copia dei backup su una cartella di rete

I backup (ogni notte, del motore e delle app) restano sul disco del motore: se quel disco si rompe, si perdono con lui. Impostazioni del motore → Copia dei backup su una cartella di rete (Proprietari) li copia ogni giorno su una cartella di rete (un NAS, una cartella condivisa di un server) o su un altro disco.

Come si imposta

  1. Sul NAS crea una cartella condivisa solo per queste copie, per esempio \\nas\backup\pyrite, chiusa a tutti gli altri (vedi Sicurezza).
  2. Dai il permesso su di lei all'account con cui gira il motore (vedi Permessi).
  3. Nella console: Impostazioni del motore, sezione Copia dei backup su una cartella di rete. Scrivi la cartella (\\nas\backup\pyrite; va bene anche un'altra unità come D:\copie-pyrite, ma non una lettera di un'unità di rete collegata come Z:: esiste solo per chi l'ha collegata), l'ora (di serie le 05:00, dopo i backup notturni delle 3:00: tutte e due sono ore del computer), i giorni e i mesi da tenere, accendi Copia ogni giorno e Salva. La cartella non può essere dentro la cartella del motore né in una cartella di Windows; se è sullo stesso disco del motore la pagina lo avvisa.
  4. Premi Prova la cartella: scrive un file di prova, lo rilegge, lo confronta e lo toglie, e dice lo spazio libero e l'account. Poi Copia adesso e aspetta «Ultima copia riuscita».

Cosa finisce nella cartella. Il motore scrive solo in <cartella>\<NOME DEL COMPUTER>, con gli stessi percorsi che hanno nella cartella del motore: control\pb_data\backups\ (backup del registro del motore: persone, accessi, impostazioni, elenco delle app), apps\<app>\state\pb_data\backups\ (backup delle app), apps\<app>\app.json e release\ (il codice delle app), archivio\ (le app archiviate, che esistono solo lì) e pyrite-giri\ (un manifest per ogni copia: data, file, impronte SHA-256, esito). Non si copiano: le chiavi in control\certificati (sono del computer), le copie di sicurezza degli aggiornamenti delle app (control\aggiornamenti_app), i punti di ripristino del motore (control\aggiornamenti), i log e i dati di un'app fuori dai suoi backup. Nemmeno i backup automatici nativi di PocketBase (nomi che cominciano con @auto_pb_backup_, che ci sono solo se qualcuno li ha accesi nelle impostazioni native di un'app o del motore): hanno gli stessi dati dei backup notturni di Pyrite, che si copiano tutti e bastano per rimettere il registro e le app. In più c'è pyrite-versioni\<data>\: la versione di prima di un file del codice o dell'archivio cambiato o tolto nel motore.

Come copia. Ogni file tutto o niente: si scrive con un nome provvisorio, si rilegge dalla cartella e si confronta con l'originale (SHA-256), e solo allora si rinomina al nome definitivo nella cartella; gli originali non si toccano mai. Un file che c'è già uguale non si ricopia. Le copie vecchie si tolgono solo dopo una copia in cui tutti i file sono stati copiati e verificati, e solo i file che ha scritto il motore (elencati nei suoi manifest): mai altri file della cartella. Con i valori di serie restano tutti i backup degli ultimi 14 giorni (il doppio dei 7 che il motore tiene sul suo disco) e, per i 12 mesi prima, il più recente di ogni mese per ogni app e per il registro; le app archiviate restano finché sono nell'Archivio e altri 12 mesi dopo che le hai eliminate per sempre; il codice delle app è sempre quello di adesso. Una copia alla volta, al più 8 ore (i file già copiati restano: la copia dopo riparte da lì); se i backup notturni sono ancora in corso, la copia li aspetta. È il lavoro pianificato pyrite_copia_rete del motore (Avanzate → Crons). Tutti i lavori pianificati del motore contano nell'ora del computer; quelli delle app restano in UTC. Se all'ora della copia il motore è spento e l'ultima copia riuscita ha più di 24 ore, la copia parte da sola 10 minuti dopo l'avvio; una copia interrotta dallo spegnimento si vede al riavvio come non riuscita.

Protezioni. La scrittura passa senza la cache di Windows e la rilettura anche (resta solo la cache del disco o del NAS). Un backup già copiato non si sovrascrive mai: se nel motore un backup con lo stesso nome è cambiato (disco rovinato, virus che cifra), la copia non riesce, lo dice, e quella in rete resta com'era. Il codice delle app e l'archivio invece cambiano: la versione di prima va in pyrite-versioni\ e resta lì per i giorni da tenere, e nella cartella dell'app c'è sempre il codice di adesso. Un'app registrata senza la sua cartella nel motore, o una cartella del motore che non si legge, fanno fallire la copia e fermano la pulizia (la copia in rete serve proprio per rimetterle). A ogni copia una parte dei file già in rete (fino a 2 GB, prima quelli verificati da più tempo) si rilegge per intero: una copia rovinata di un file che il motore ha ancora si rifà (evento), una di un file che il motore non ha più è un evento d'errore. La copia non legge e non scrive mai attraverso un collegamento (giunzione) nella cartella di rete, e controlla dove sta davvero ogni file che scrive. La pulizia non si fa se l'ora del computer è prima dell'ultima copia o più di 48 ore dopo l'ultima riuscita (con un avviso: controlla l'ora; se l'ora di adesso è giusta e il manifest più recente viene da un orologio sbagliato, copialo fuori da pyrite-giri\ e poi cancellalo), toglie solo i file con i nomi e nelle cartelle che il motore scrive, e lascia sempre almeno gli ultimi 3 backup verificati di ogni app e del registro. Con lo spazio finito la copia toglie prima le copie scadute che il motore non ha più e riprova una volta. Se nella cartella del computer ci sono le copie di un altro motore con lo stesso nome del computer, la copia si ferma senza scrivere niente: scegli un'altra cartella.

Se non riesce si vede. Un evento d'errore con il motivo in parole semplici (cartella non raggiungibile, accesso negato con l'account del motore e cosa fare, spazio finito, impronta diversa, troppo lenta); nella Panoramica un riquadro rosso quando la copia è accesa e l'ultima riuscita ha più di 26 ore (o non ce n'è mai stata una); nella pagina Backup una riga con l'ultima copia riuscita (verde; gialla se l'ultima copia non è riuscita, rossa dopo 26 ore).

Permessi sulla cartella

Nessuna password salvata: la copia gira con l'account del motore (lo mostra la sezione, e lo dice la prova).

Sicurezza

Rimettere un'app da una copia

  1. Nella cartella di rete apri <NOME DEL COMPUTER>\apps\<app>\state\pb_data\backups\ e scegli il backup (il nome ha data e ora: auto_20261105_030000.zip).
  2. Copialo (copia, non spostare) nella stessa cartella del motore: apps\<app>\state\pb_data\backups\.
  3. Console → Backup → l'app: il file è nell'elenco. Premi Ripristina: il motore ferma l'app, tiene una copia dei dati di adesso (state\copia_prima_del_ripristino_…), rimette il backup e riaccende l'app.

Un'app di cui manca tutta la cartella: copia apps\<app>\ dalla cartella di rete (codice e backup) in apps\ del motore, poi Rileggi cartelle, avviala e ripristina il backup come sopra. Un'app archiviata: copia archivio\<voce>\ di nuovo in archivio\ del motore e usa la pagina Archivio.

Ripristinare il registro del motore

Il registro (persone, livelli, gruppi, chi entra in quale app, impostazioni, elenco delle app) si ripristina a motore fermo. Quello che è cambiato dopo quel backup (persone nuove, password, accessi) si perde.

  1. Scegli il backup: in control\pb_data\backups\ del motore, oppure nella cartella di rete (<NOME DEL COMPUTER>\control\pb_data\backups\).
  2. Icona vicino all'orologio → Esci.
  3. Copia l'intera cartella control\pb_data in una cartella fuori dal motore (copia, non spostare: è la strada per tornare indietro).
  4. Estrai lo zip (clic destro → Estrai tutto) in una cartella fuori dal motore: dentro ci sono data.db, auxiliary.db e forse storage\.
  5. In control\pb_data cancella data.db-wal, data.db-shm, auxiliary.db-wal, auxiliary.db-shm se ci sono, poi copia i file estratti sopra quelli di control\pb_data (sostituisci). Non toccare control\pb_data\backups.
  6. Avvia il motore e controlla persone e app nella console. Se qualcosa non va: Esci, rimetti la cartella copiata al passo 3, riavvia.

Un computer nuovo (il disco vecchio non c'è più)

  1. Metti pyrite.exe (la stessa versione) in una cartella nuova; non avviarlo ancora.
  2. Nella cartella del motore crea a mano la cartella control\pb_data (il motore non è ancora partito, quindi non c'è). Poi dalla cartella di rete <NOME DEL COMPUTER VECCHIO>\ copia nella cartella del motore control\pb_data\backups\ (dentro la control\pb_data appena creata), apps\ e archivio\ (non pyrite-giri\ e pyrite-versioni\).
  3. Rimetti il registro dal suo backup più recente (passi 4 e 5 qui sopra).
  4. Avvia il motore: le app ci sono, con il loro codice e i dati vuoti. Per ogni app con database: Backup → l'app → il backup più recente → Ripristina.
  5. HTTPS: il certificato non è nella copia (le sue chiavi sono del computer vecchio): rifallo dalla pagina Certificati. La copia di rete si riaccende con il registro e scrive nella cartella con il nome del computer nuovo.

30 /Spostare Pyrite su un altro computer

Vale quando il computer vecchio funziona ancora e vuoi Pyrite su uno nuovo. Se il disco vecchio non c'è più, vedi sopra Un computer nuovo (il disco vecchio non c'è più).

  1. Spegni prima il motore (icona vicino all'orologio → Esci, oppure ferma il servizio), così nessun file viene scritto durante la copia.
  2. Copia tutta la cartella di Pyrite, non solo pyrite.exe: deve contenere control, apps e logs. Il registro del motore (persone, livelli, gruppi, elenco delle app) è il file control\pb_data\data.db: senza, il motore nuovo parte vuoto.
  3. È più sicuro fare uno ZIP della cartella ed estrarlo sul computer nuovo in una cartella nuova e vuota, invece di copiare file per file.
  4. Come si riconosce una copia riuscita. Al primo avvio la pagina del primo Proprietario non compare: si arriva alla pagina d'accesso e le persone ci sono. Se compare la pagina del primo Proprietario, la copia è incompleta (di solito manca control\pb_data\data.db). Non creare niente: chiudi il motore e rifai la copia.
    Copia incompleta? Lo dice Pyrite stesso. Se manca control\pb_data\data.db ma la cartella mostra una vita passata (vecchi log, app con i loro dati, lo storico), la pagina del primo Proprietario mostra un avviso e non va avanti finché non spunti «Sì, è un motore nuovo»; lo stesso avviso è scritto nella finestra del motore e in logs\engine.log (vale anche quando Pyrite parte dall'icona o come servizio: allora lo dicono il log e la pagina); da terminale, pyrite.exe owner create EMAIL si ferma e chiede --new-engine. Se è una copia: chiudi il motore e rifai la copia, con tutta la cartella. Solo se è davvero un motore nuovo, spunta la casella (oppure usa --new-engine): lo Storico lo registra. L'avviso sparisce da solo quando il registro è tornato. Un motore davvero nuovo, con la cartella vuota, non mostra nessun avviso.
  5. Che cosa è legato al computer e va rifatto. Il certificato HTTPS: le sue chiavi sono del computer vecchio, quindi lo rifai dalla pagina Certificati (vedi sopra Un computer nuovo e HTTPS e certificati). La doppia autenticazione: la chiave dei codici si apre solo sul computer che l'ha fatta, quindi chi l'aveva risulta «da riattivare» (vedi La chiave e i backup).
  6. Impostazioni di Windows da rifare. Il firewall: la regola è per il file su quel computer. Sul computer nuovo pyrite.exe firewall status dice se c'è; pyrite.exe firewall open (da amministratore) la crea, e l'installazione del servizio la crea da sola (vedi Il firewall di Windows; Windows può chiederla anche al primo avvio, vedi Primo avvio). E l'avvio con Windows (il menu dell'icona, il servizio o l'attività pianificata: vedi Pyrite come servizio di Windows).
  7. Tieni spento il computer vecchio, con la sua cartella intatta, per qualche giorno. È la strada per tornare indietro. Non avviare i due motori insieme nella stessa rete: una cartella copiata così com'è porta con sé il suo identificativo, e le due copie si buttano fuori dall'accesso (vedi Più motori sullo stesso server).

31 /Lingue, colori e tema

32 /Aggiornare dalla 0.7.6

Si fa come l'aggiornamento dalla 0.7.5, descritto qui sotto: si sostituisce solo pyrite.exe, il motore fa da solo il punto di ripristino e aggiorna tutto o niente. Questa volta non ci sono controlli da fare sugli script delle app. Dopo l'aggiornamento la finestrella dell'icona e pyrite.exe -v devono dire alpha 0.7.7 (vedi «Cosa controllare dopo l'aggiornamento» qui sotto). Per tornare indietro: update-restore, come descritto qui sotto.

Che cosa cambia da solo

Che cosa non cambia finché non lo decidi tu

33 /Aggiornare dalla 0.7.5

Il motore si aggiorna sostituendo solo pyrite.exe: stesso nome, stessa cartella. Indirizzi, porte, accessi, dati, app, persone e impostazioni restano dove sono, e nessuno viene buttato fuori: chi era entrato nel portale resta dentro. Per sapere che programma hai, pyrite.exe -v scrive la versione. Questo capitolo vale anche per arrivare alla 0.7.7 dalla 0.7.5; chi viene dalla 0.7.5 legga anche Aggiornare dalla 0.7.6: quello che cambia da solo vale anche per lui.

  1. Controlla il pyrite.exe nuovo: in PowerShell, nella sua cartella, Get-FileHash .\pyrite.exe -Algorithm SHA256 deve dare la stessa impronta SHA-256 che hai ricevuto insieme al file (nel messaggio o nella pagina da cui l'hai scaricato). Se è diversa, non avviarlo.
  2. Ferma il motore: icona vicino all'orologio → Esci. Aspetta che l'icona sparisca. Se Pyrite gira come servizio di Windows: net stop pyrite-… (vedi Pyrite come servizio di Windows).
  3. Tieni il programma vecchio: copia pyrite.exe (copia, non spostare) in una cartella fuori dal motore, con il nome della versione che hai, per esempio C:\Pyrite-0.7.5\pyrite.exe. Serve per tornare indietro.
  4. Copia il pyrite.exe nuovo nella cartella del motore, sopra quello vecchio (stesso nome). Non cambia nient'altro.
  5. Prima di aggiornare, fai i controlli sugli script delle app elencati qui sotto (Controlli da fare prima) e fai una copia dell'intera cartella a motore fermo.
  6. Fai doppio clic su pyrite.exe (o net start pyrite-…). Prima di cambiare qualcosa il motore controlla la cartella (nessun altro motore acceso su di essa, file che può scrivere, spazio libero sul disco a sufficienza) e fa da solo un punto di ripristino: una copia dei dati del motore e dei dati e delle impostazioni delle app, in control\aggiornamenti\ (si tengono gli ultimi 2). Poi aggiorna. Tutto o niente: se qualcosa va storto, o il computer si spegne a metà, il motore rimette tutto a posto dal punto di ripristino e lo scrive in logs\engine.log; riavvialo per riprovare, oppure rimetti il pyrite.exe vecchio. Se un controllo non passa, il motore non cambia niente, non parte e dice perché (vedi Problemi).
  7. Se Windows mostra la finestra «Sicurezza di Windows», scegli Reti private e consenti, come al primo avvio. Di solito non la chiede, perché il file ha lo stesso nome nella stessa cartella.
  8. Le sessioni della console sono tenute solo in memoria: dopo il riavvio, Proprietari e Admin rientrano con la stessa email e la stessa password. Dalla 0.7.5 tutti rientrano una volta nel portale (vedi sotto); dalla 0.7.6 chi era nel portale resta dentro.

Con molte app e tanti dati il primo avvio ci mette di più, perché il punto di ripristino copia prima i dati. Serve spazio libero sul disco pari ai dati: se non c'è, il motore non cambia niente e dice quanto ne serve.

Cosa cambia dalla 0.7.5

Controlli da fare prima sugli script delle app

La 0.7.6 stringe il recinto degli script (vedi Che cosa può fare un'app). Prima di aggiornare, per ogni app, cerca nei file di apps\NOME-APP\release\pb_hooks e pb_migrations queste cose. Se non ne trovi, per quell'app l'aggiornamento non cambia niente.

Che cosa succede a un'app che usa una di queste cose: lo script riceve un errore in inglese e quella parte dell'app non funziona. Il motore smette di riavviare un'app con un problema nei file e riprova quando i file cambiano o quando premi Riavvia; la scheda Stato e gli eventi dicono perché. Se qualcosa non va dopo l'aggiornamento, la via di ritorno è update-restore (qui sotto).

Se arrivi dalla 0.7.4

Cosa controllare dopo l'aggiornamento

Tornare alla versione di prima

Per tornare indietro, lancia sempre pyrite.exe update-restore --yes PRIMA di rimettere il pyrite.exe vecchio. Se rimetti solo l'exe, il motore vecchio prende la cartella per un aggiornamento: fa un punto di ripristino nuovo e toglie il più vecchio, e dopo un altro passaggio avanti non c'è più il punto con i dati di prima dell'aggiornamento.

  1. Ferma il motore: icona → Esci (o net stop pyrite-…).
  2. Apri un prompt dei comandi (cmd) nella cartella del motore (in PowerShell scrivi .\pyrite.exe al posto di pyrite.exe) e lancia pyrite.exe update-restore. Non cambia niente: dice soltanto che cosa farebbe. Quale punto di ripristino, di quando, e quali scelte fatte dopo l'aggiornamento annulla: le persone tolte o bloccate dopo tornano attive, le password cambiate dopo tornano quelle vecchie, tornano i Proprietari, gli accessi e le app tolti dopo. Il piano dice anche chi torna Admin, chi non lo è più e a chi tornano le app gestite di prima; chi perde i ruoli di Admin Persone e Admin App ricevuti dopo l'aggiornamento; le unità create dopo e le persone create dopo, che tornando indietro non ci saranno più; chi perde la doppia autenticazione e chi resta fuori perché la chiave del server è stata rifatta dopo il punto. Scrivi tutto. Il prompt torna subito (vedi Per i tecnici): aspetta l'ultima riga, «Non è stato cambiato niente. Per andare avanti: pyrite.exe update-restore --yes».
  3. Lancia pyrite.exe update-restore --yes e aspetta la riga «Fatto in … s»: rimette i dati del motore e i dati e le impostazioni delle app com'erano prima dell'aggiornamento. Quello che è cambiato dopo l'aggiornamento (anche quello che le persone hanno scritto nelle app nel frattempo) si copia prima da parte, in control\aggiornamenti\ritorno_…; il motore quella copia non la cancella mai (la pagina Backup la elenca): cancellala a mano quando non ti serve più.
  4. Solo dopo, rimetti il programma vecchio: copia C:\Pyrite-0.7.5\pyrite.exe (o quello della tua versione di prima) nella cartella del motore, sopra quello nuovo, e avvialo. Se invece riavvii la versione nuova, si aggiorna di nuovo, con un punto di ripristino nuovo.
  5. Controlla: la finestrella dice la versione di prima; nella pagina Backup, riquadro Aggiornamenti del motore, il punto dell'aggiornamento è «rimesso con update-restore»; le app sono accese con i dati di prima dell'aggiornamento.
  6. Nella console rifai quello che il comando ha elencato: blocca di nuovo le persone, cambia di nuovo le password, togli di nuovo Proprietari, accessi e app. Le persone rifanno l'accesso al portale, una volta.

Che cosa si perde tornando indietro. Il registro torna com'era prima dell'aggiornamento: tornano il livello e le app gestite di allora, mentre le unità, i ruoli e i campi nuovi spariscono. Si perde quello che è stato fatto dopo l'aggiornamento: persone create, livelli e app gestite cambiati, accessi, doppia autenticazione attivata. Prima del ritorno il motore ne fa una copia in control\aggiornamenti\ritorno_…. Lo storico non torna indietro: le righe del riepilogo restano. Se poi riavvii la versione nuova, il passaggio riparte dai dati del punto, dà lo stesso risultato e riscrive il riepilogo (una volta). Il file control\passaggio-ruoli.txt resta dov'è e viene riscritto.

A motore acceso, update-restore rifiuta e non cambia niente. Un'app archiviata dopo l'aggiornamento torna tra le app, con i dati di prima dell'aggiornamento, e la sua copia archiviata resta in archivio\ con i dati di quando è stata archiviata: sono due copie, quindi prima di eliminarne una guarda quale tenere. Un'app installata dopo l'aggiornamento esce dal motore (i suoi file restano nella copia messa da parte). Un'app aggiornata da zip dopo l'aggiornamento del motore torna alla versione di prima, e il suo «Torna alla versione di prima» non è più offerto: la copia di sicurezza di quell'aggiornamento tiene i dati del giro che si è lasciato indietro (resta sul disco, segnata come superata; il piano di update-restore la elenca). Gli stessi passi sono nella pagina Backup del motore, riquadro Aggiornamenti del motore. update-restore non tocca i backup, le copie fatte prima di un ripristino, i log, lo storico del motore e le sue copie.

I certificati: la 0.7.4 usa solo il certificato di serie. Se dalla 0.7.5 torni alla 0.7.4 e poi di nuovo avanti, i certificati di Let's Encrypt tornano da soli (o Pyrite li richiede); il conto di Let's Encrypt e la chiave di Cloudflare restano. I certificati in più caricati a mano vanno ricaricati se la 0.7.4 ne ha tolto la cartella.

34 /Fermare le app e il motore

35 /Pyrite come servizio di Windows

Oltre che con l'icona vicino all'orologio, Pyrite può girare come servizio di Windows. Come servizio parte da solo quando si accende il server, anche se nessuno si collega; se si ferma per un guasto, Windows lo fa ripartire dopo un minuto (fino a tre volte al giorno); quando il server si spegne, Pyrite ferma le app in ordine. Non ha icona né finestre: la console si apre dall'indirizzo di sempre, anche dal server stesso (un doppio clic su pyrite.exe apre la console nel browser). I messaggi principali sono anche nel Visualizzatore eventi di Windows (Registri di Windows → Applicazione, origine pyrite-…), oltre che in logs\engine.log.

Su un server, non avviare Pyrite con il doppio clic da un utente amministratore di Windows. Avviato così, il motore e gli script di tutte le app girano con i diritti pieni sul server. Il modo previsto è il servizio di Windows, che gira con un account suo (vedi sotto).

Installare, guardare, togliere

L'account e la cartella

Anche il primo avvio può chiedere la stessa scelta, con la tua sessione (icona) o come servizio: vedi Primo avvio.

36 /Avvio senza nessuno collegato

Il modo migliore per far partire Pyrite senza nessuno collegato è il servizio di Windows (vedi Pyrite come servizio di Windows). Se preferisci un'attività pianificata di Windows, o il servizio non si può usare, si fa così. L'attività si prepara una volta sola. Dopo averla preparata, provala come descritto in «I limiti dell'attività pianificata».

Cosa preparare

L'attività pianificata

Il comando è C:\Pyrite\pyrite.exe --autostart --unattended.

In PowerShell come amministratore:

$c = Get-Credential 'DOMINIO\svc-pyrite'   # una finestra chiede la password, così non resta nella cronologia dei comandi
$a = New-ScheduledTaskAction -Execute 'C:\Pyrite\pyrite.exe' -Argument '--autostart --unattended' -WorkingDirectory 'C:\Pyrite'
$t = New-ScheduledTaskTrigger -AtStartup
$t.Delay = 'PT1M'    # un minuto dopo l'avvio, così la rete (e il NAS) è pronta
$s = New-ScheduledTaskSettingsSet -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 1) `
       -ExecutionTimeLimit ([TimeSpan]::Zero) -StartWhenAvailable -AllowStartIfOnBatteries `
       -DontStopIfGoingOnBatteries -MultipleInstances IgnoreNew
Register-ScheduledTask -TaskName 'Pyrite' -Action $a -Trigger $t -Settings $s `
       -User $c.UserName -Password $c.GetNetworkCredential().Password -RunLevel Limited

La stessa cosa a mano: Utilità di pianificazione → Crea attività; Generale: l'account, Esegui indipendentemente dalla connessione dell'utente, lascia senza la spunta Non memorizzare la password (la password la tiene Windows); Trigger: All'avvio, ritardo di 1 minuto; Azioni: avvia il programma C:\Pyrite\pyrite.exe, argomenti --autostart --unattended, inizia in C:\Pyrite; Impostazioni: Se l'attività non riesce, riavvia ogni 1 minuto, fino a 3 volte; togli la spunta a Arresta l'attività se è in esecuzione da più di; Se l'attività è già in esecuzione: non avviare una nuova istanza. Non usare Esegui con i privilegi più elevati: il motore non ne ha bisogno.

Codici di uscita e cosa succede

CodiceQuandoCosa fa l'attività
0Il motore è stato fermato su richiesta (Esci, Windows che si spegne).Niente: non è un guasto.
1Un errore: la porta 8080 è occupata da un altro programma; logs\engine.log non si apre (l'account non ha Modifica sulla cartella); l'icona o il motore non partono; il motore si ferma da solo.«Se l'attività non riesce, riavvia» dovrebbe farla ripartire (fino a 3 volte, a un minuto una dall'altra): vedi sotto. Il motivo è in logs\engine.log (se il log si può aprire).
3C'è già un Pyrite acceso per la stessa cartella, oppure uno risponde già sulla stessa porta.La copia nuova si fa da parte: un riavvio ritroverebbe il primo, quindi dopo i tentativi l'attività resta com'è. La riga in logs\engine.log dice quale dei casi era.

Se termini l'attività (Stop-ScheduledTask, o «Termina» nell'Utilità di pianificazione), il codice di uscita non lo sceglie Pyrite: lo decide Windows.

Per farla partire senza riavviare il PC: Start-ScheduledTask -TaskName Pyrite. Stop-ScheduledTask termina l'attività, ma non è provato che il motore si fermi in modo ordinato: il motore si chiude con ordine solo quando il programma che lo avvia riceve la richiesta di chiudere o Windows si spegne, e terminare un'attività di solito chiude il processo subito. Quindi, prima di fermarla, ferma le app dalla console (pulsante Ferma nella pagina di ogni app) e, se hai appena cambiato qualcosa, fai un backup dalla pagina Backup; dopo il riavvio guarda la Panoramica e logs\engine.log. Un motore avviato a mano e l'attività non possono girare insieme sulla stessa cartella: un secondo motore sulla stessa cartella non parte (codice di uscita 3 senza nessuno davanti allo schermo).

I limiti dell'attività pianificata

37 /Avvertenze dell'alpha

  • Prima di tutto la rete locale. Senza un certificato il motore lavora in HTTP e password e dati viaggiano in chiaro dentro la rete: accendi HTTPS dalla pagina Certificati. Dalla 0.7.5 puoi aprire alcune app a internet (Regole di rete): fallo solo con HTTPS acceso, un'app alla volta, e solo per dati non sensibili. La console da internet non si apre mai.
  • Solo dati non sensibili. Non usarlo per dati personali da proteggere, dati sanitari, pagamenti o cose critiche.
  • Nessuna garanzia. È un'alpha, fornita «così com'è», per provare il prodotto. Formati dei dati e schermate possono cambiare nelle prossime versioni. Tieni copie di quello che conta.
  • App di più clienti su un motore. Il recinto intorno agli script è una difesa dentro il programma, non un muro: non contarci da solo per script scritti da qualcuno di cui non ti fidi (vedi Che cosa può fare un'app).
  • Aggiornare il motore. Il motore fa da solo un punto di ripristino. Per avere una rete di sicurezza in più in questa alpha, puoi anche copiare l'intera cartella a motore fermo, prima di sostituire pyrite.exe.

38 /Limiti noti

Sono le cose che la 0.7.7 non fa, o fa solo in parte. Stanno qui perché tu le sappia prima di fidartene.

39 /Per i tecnici

I comandi

Si scrivono in una finestra dei comandi aperta nella cartella del programma (in PowerShell scrivi .\pyrite.exe invece di pyrite.exe); con un comando dopo il nome, il programma scrive in quella finestra. Senza nessun comando (pyrite.exe da solo) parte come con il doppio clic, con l'icona.

comandocosa fa
pyrite.exe serve --http=0.0.0.0:8080il motore nel terminale, sull'indirizzo e la porta scelti; Ctrl+C lo ferma in modo ordinato
pyrite.exe owner reset EMAILuna password provvisoria per un Proprietario, scritta una sola volta, da cambiare al prossimo accesso; le altre sessioni della console di quel Proprietario si chiudono. Con --enable riattiva anche un Proprietario disattivato. Solo per i Proprietari
pyrite.exe owner create EMAILcrea un Proprietario con una password provvisoria, quando /setup/ non si può aprire; --name "Maria Rossi" per il nome. Se il motore ha già un Proprietario attivo, ripeti l'email con --confirm EMAIL. Se la cartella sembra la copia incompleta di un Pyrite che c'era già, il comando si ferma e chiede --new-engine (vedi Spostare Pyrite su un altro computer). Mai un'email che è già nella rubrica (per un Proprietario che c'è già si usa owner reset)
pyrite.exe owner two-factor-off EMAILtoglie la doppia autenticazione a un Proprietario (telefono perso, motore spostato), a motore acceso o spento; le sessioni di quel Proprietario si chiudono. Solo per i Proprietari (vedi Doppia autenticazione)
pyrite.exe update-restorea motore fermo, rimette il punto di ripristino dell'ultimo aggiornamento del motore (i dati del motore, i dati e le impostazioni delle app); senza --yes dice soltanto che cosa farebbe. Poi rimetti il pyrite.exe di prima (vedi Aggiornare dalla 0.7.5)
pyrite.exe network statusle regole di rete in uso (file control\pyrite.json). A motore fermo, network reset torna ai valori della 0.7.4 e network setup fa le due domande sulla rete (vedi Regole di rete)
pyrite.exe service installin un Prompt dei comandi aperto come amministratore: installa Pyrite come servizio di Windows; service status dice come sta, service uninstall lo toglie; service install --no-firewall salta la regola del firewall (vedi Pyrite come servizio di Windows)
pyrite.exe firewall statuscom'è il firewall di Windows per Pyrite (non servono diritti di amministratore); firewall open e firewall close creano e tolgono la regola per il programma (solo TCP), in un Prompt dei comandi aperto come amministratore (vedi Il firewall di Windows)
pyrite.exe certificates offa motore fermo, torna in HTTP quando l'HTTPS è configurato male (il certificato resta: si riaccende dalla console); certificates status dice com'è impostato HTTPS (vedi Uscita d'emergenza)
pyrite.exe import <file>legge un file CSV, Excel (.xlsx, .xls) o JSON e dice colonne e tipi, senza caricare niente; opzioni come -sheet, -separator, -encoding, -header none|titles|preamble, -json (tutte con import -h)
pyrite.exe toolsil catalogo degli strumenti del motore; --md il capitolo sugli strumenti dello standard per gli agenti, --json i dati, --lang it i testi in italiano
pyrite.exe --helpl'elenco dei comandi

40 /Problemi e licenze

Pyrite contiene PocketBase (licenza MIT, © Gani Georgiev) e altri componenti open source: le loro licenze sono in THIRD-PARTY-NOTICES.txt. Pyrite is an independent project built on PocketBase; it is not affiliated with or endorsed by PocketBase or its author. (Pyrite è un progetto indipendente costruito su PocketBase; non è affiliato a PocketBase né al suo autore, che non lo approvano né lo sostengono.)