27 dic 2025·8 min di lettura

Repliche PostgreSQL per il reporting: mantieni le dashboard veloci

Usa repliche PostgreSQL per il reporting per mantenere le dashboard veloci, proteggendo il database primario da query lente, picchi e contesa.

Repliche PostgreSQL per il reporting: mantieni le dashboard veloci

Perché il reporting può rallentare il database primario

Un caso comune è questo: l'app sembra andare bene per gran parte della giornata, poi qualcuno apre una dashboard e improvvisamente i checkout, i login o gli strumenti di supporto iniziano a rallentare. Nulla è “down”, ma tutto è più lento. Di solito è il tuo database primario che viene tirato in due direzioni contemporaneamente.

Le transazioni (il lavoro quotidiano dell'app) sono brevi e selettive. Leggono o aggiornano un piccolo numero di righe, usano indici e finiscono in fretta così le richieste successive possano proseguire. Le query di reporting si comportano diversamente. Spesso scandagliano molti dati, uniscono più tabelle, ordinano e raggruppano risultati, e calcolano totali su giorni o mesi. Anche quando non bloccano direttamente le scritture, possono comunque consumare le stesse risorse condivise di cui l'app ha bisogno.

Ecco i modi più comuni in cui le dashboard danneggiano un database OLTP:

  • Letture pesanti che competono per CPU, memoria e I/O su disco
  • Grandi scansioni che scacciano le pagine “calde” dalla cache, rendendo più lente le query normali
  • Grandi ordinamenti e GROUP BY che riversano su disco e creano picchi di carico
  • Query di lunga durata che aumentano la contesa e prolungano i picchi
  • Filtri ad hoc (intervalli di date, segmenti) che rendono il carico imprevedibile

Una replica in sola lettura è un server PostgreSQL separato che copia continuamente i dati dal tuo server primario e può servire query read-only. Usare repliche PostgreSQL per il reporting permette alle dashboard di eseguire i loro lavori pesanti altrove, così il primario può concentrarsi sulle transazioni veloci.

La aspettativa da fissare subito: le repliche aiutano le letture, non le scritture. Non puoi inviare in sicurezza insert/update a una replica standard, e i risultati possono essere leggermente indietro rispetto al primario perché la replica impiega tempo a replicare. Per molte dashboard questo è un buon compromesso: numeri leggermente meno “freschi” in cambio di prestazioni applicative costanti.

Se costruisci dashboard interne (per esempio in AppMaster) questa separazione spesso si mappa bene: l'app continua a scrivere sul primario, mentre le schermate di reporting interrogano la replica.

Come funzionano le repliche in PostgreSQL (in parole semplici)

Una replica PostgreSQL è un secondo server di database che mantiene una copia quasi in tempo reale del tuo database principale (primario). Il primario gestisce le scritture (INSERT, UPDATE, DELETE). La replica serve principalmente letture (SELECT), così le query di reporting non competono con le transazioni quotidiane.

Primario vs replica in un minuto

Pensa al primario come al cassiere in un negozio affollato: deve rimanere reattivo perché ogni vendita aggiorna stock, pagamenti e ordini. Una replica è come uno schermo espositivo che mostra totali e tendenze. Osserva quello che fa il cassiere e aggiorna la sua vista poco dopo.

Sotto il cofano, PostgreSQL copia le modifiche inviando un flusso di ciò che è cambiato sul primario e riproducendolo sulla replica. Questo significa che la replica finisce con la stessa struttura e gli stessi dati, solo leggermente indietro.

In termini pratici, la replica copia:

  • Dati delle tabelle (righe)
  • Modifiche agli indici (così le query possono usare gli stessi indici)
  • Modifiche allo schema (nuove colonne, nuove tabelle e molti tipi di migrazioni)
  • La maggior parte delle altre modifiche al database che avvengono tramite SQL normale

Cosa una replica non risolve: non renderà le scritture pesanti magicamente più economiche, né risolverà una query lenta dovuta a uno schema inefficiente o indici mancanti. Se la tua query di dashboard scandaglia una tabella gigantesca sulla replica, può comunque essere lenta. Semplicemente non rallenterà il checkout nello stesso momento.

Per questo le repliche PostgreSQL per il reporting sono popolari: separano il lavoro OLTP (transazioni veloci e frequenti) dal lavoro in stile OLAP (letture più lunghe, raggruppamenti e totali). Se costruisci dashboard o pannelli amministrativi interni (per esempio in AppMaster), puntare le pagine di reporting a una replica è spesso il modo più semplice per tenere felici entrambe le parti.

Carichi di lavoro comuni di reporting da mettere su una replica

Una buona regola: se una query legge principalmente molti dati per sintetizzarli, è un forte candidato a essere eseguito su una replica. Con repliche PostgreSQL per reporting proteggi i flussi di checkout, i login e altri lavori transazionali dal carico pesante che le dashboard spesso richiedono.

Il pattern più comune per una dashboard è un ampio intervallo di date più alcuni filtri. “Ultimi 90 giorni per regione, prodotto e canale” può facilmente toccare milioni di righe, anche quando il grafico finale mostra solo 12 colonne. Queste scansioni possono competere con il tuo database primario per letture da disco e spazio in cache.

Carichi adatti alla replica

La maggior parte dei team inizia spostando sul database di reporting:

  • Grandi join su più tabelle (orders + items + customers + refunds)
  • Aggregazioni come SUM, COUNT DISTINCT, calcoli di percentile, cohort
  • Query di lunga durata che ordinano e raggruppano grandi insiemi di risultati
  • Report pianificati che girano ogni ora/giorno e rifanno lo stesso lavoro pesante
  • Sessioni BI esplorative dove le persone cliccano e rieseguono variazioni

Anche quando una query è “read-only”, può comunque consumare CPU, memoria e I/O. Grandi GROUP BY possono espellere altre query dalla memoria. Scansioni ripetute possono agitare la buffer cache, così il primario inizia a leggere più spesso dal disco.

Anche il comportamento delle connessioni conta. Molti strumenti BI aprono più connessioni per utente, aggiornano le tile ogni pochi minuti e eseguono estrazioni in background. Questo può creare picchi improvvisi di connessioni e query concorrenti. Una replica dà a questi picchi un posto più sicuro dove atterrare.

Un esempio semplice: la tua dashboard operativa si apre alle 9:00 e 50 persone la visualizzano contemporaneamente. Ogni pagina avvia più widget, e ogni widget esegue una query con un filtro diverso. Sul primario quel picco può rallentare la creazione degli ordini. Su una replica, la dashboard può essere più lenta o leggermente indietro, ma le tue transazioni restano veloci.

Se costruisci dashboard interne all'interno di una piattaforma come AppMaster, puntare le schermate di reporting a una connessione replica è spesso una vittoria facile, purché tutti comprendano che i dati possono avere qualche secondo (o minuto) di ritardo.

Il compromesso: freschezza vs velocità (replication lag)

Una replica mantiene le dashboard veloci perché toglie le query di reporting dal tuo database primario. Il costo è che una replica di solito è un po' indietro. Questo ritardo si chiama replication lag ed è il principale compromesso nelle repliche PostgreSQL per il reporting.

Quello che gli utenti notano è semplice: il numero “oggi” è un po' basso, gli ultimi ordini mancano o un grafico si aggiorna qualche minuto dopo. La maggior parte delle persone non si preoccupa se una tendenza settimanale è in ritardo di 2 minuti, ma si preoccupa se una vista “pagamento appena riuscito” è sbagliata.

Il lag avviene quando il primario produce cambiamenti più velocemente di quanto la replica possa riceverli e riprodurli. Cause comuni includono picchi di scrittura (flash sale, import), banda di rete limitata, disco lento sulla replica o query lunghe che competono per CPU e I/O mentre la replica tenta di applicare le modifiche.

Un modo pratico per scegliere un lag accettabile è abbinarlo alla decisione che la dashboard supporta:

  • Dashboard KPI executive: secondi fino a qualche minuto spesso vanno bene.
  • Code operative (spedizioni, support): puntare a near real time, di solito secondi.
  • Chiusure finanziarie o audit: eseguirle su uno snapshot controllato, non “live”.
  • Schermate cliente “i miei ordini recenti”: near real time, oppure usare il primario.

Regola semplice: se un report deve includere la transazione appena commessa, deve leggere dal primario (o da un sistema progettato per freschezza garantita). Esempi tipici sono disponibilità di inventario durante il checkout, controlli antifrode e qualsiasi cosa che scateni un'azione immediata.

Esempio: un dashboard del team commerciale può leggere in sicurezza da una replica e aggiornarsi ogni minuto. Ma la pagina di conferma dell'ordine dovrebbe leggere dal primario, perché mostrare “nessun ordine trovato” per un ordine appena piazzato è un ticket di supporto che aspetta di accadere.

Se la tua app o il tuo strumento no-code ti permette di scegliere una connessione al database (per esempio, puntare schermate in sola lettura a una replica in AppMaster), puoi applicare questa separazione senza cambiare come il team costruisce l'interfaccia.

Passo dopo passo: configurare repliche per le dashboard

Stabilizza le tue query di reporting
Costruisci uno strato di reporting con endpoint puliti invece di query BI ad hoc.
Inizia ora

Configurare una replica per le dashboard riguarda principalmente fare alcune scelte chiare all'inizio, poi mantenere il traffico di reporting lontano dal database primario.

1) Parti dalla topologia giusta

Inizia dalla topologia. Una replica è spesso sufficiente per un singolo strumento BI e poche dashboard. Repliche multiple aiutano quando hai molti analisti o diversi strumenti che interrogano i dati tutto il giorno. Se i tuoi utenti sono lontani dalla regione principale, una replica regionale può ridurre la latenza per le dashboard, ma aggiunge anche più punti da monitorare.

Poi scegli tra replica sincrona o asincrona. La sincrona dà la migliore freschezza ma può rallentare le scritture, il che vanifica lo scopo per molti team. L'asincrona è la scelta abituale per le dashboard, purché tutti accettino che i dati possano essere leggermente indietro.

2) Costruisci la replica come un server di reporting

Una replica non è una copia economica della produzione. Le query di reporting spesso richiedono più CPU, più memoria per gli ordinamenti e dischi veloci per le scansioni.

Ecco un flusso pratico per impostare repliche PostgreSQL per il reporting:

  • Decidi quante repliche servono e dove collocarle (stessa regione o più vicine agli utenti).
  • Scegli async vs sync in base a quanto ritardo le dashboard possono tollerare.
  • Provisiona risorse per lavoro in sola lettura pesante (CPU, RAM e IOPS su disco contano più della sola dimensione di storage).
  • Crea credenziali separate in sola lettura per utenti e strumenti di reporting.
  • Instrada le query delle dashboard alla replica (configura la tua app, lo strumento BI o un piccolo servizio di reporting per usare la connessione della replica).

Dopo il routing, valida con un test semplice: esegui una query pesante nota della dashboard e conferma che non appare più nell'attività del database primario.

Se costruisci app con AppMaster, di solito questo significa definire una connessione database separata per il reporting e usarla solo per gli endpoint della dashboard, così checkout e altri flussi transazionali mantengono il proprio percorso veloce.

Controllo degli accessi e sicurezza per gli utenti di reporting

Una replica in sola lettura è ottima per le dashboard, ma ha comunque bisogno di linee guida. Trattala come una risorsa condivisa: dai agli strumenti di reporting solo l'accesso necessario e limita quanto può fare una query mal fatta.

Inizia con un utente database separato per il reporting. Evita di riutilizzare le credenziali principali dell'app, anche se punti alla replica. Questo facilita l'audit delle attività, la rotazione delle password e il restringimento dei privilegi.

Ecco un approccio semplice che si adatta alla maggior parte dei team:

-- Create a dedicated login
CREATE ROLE report_user LOGIN PASSWORD '...';

-- Allow read-only access to a schema
GRANT CONNECT ON DATABASE yourdb TO report_user;
GRANT USAGE ON SCHEMA public TO report_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO report_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT ON TABLES TO report_user;

-- Put safety limits on the role
ALTER ROLE report_user SET statement_timeout = '30s';
ALTER ROLE report_user SET idle_in_transaction_session_timeout = '15s';

Poi, controlla gli storm di connessioni. Dashboard e strumenti BI aprono volentieri molte connessioni, specialmente quando più widget si aggiornano insieme. Limita le connessioni di reporting sul database e sul pooler, e tienile separate dal traffico transazionale.

Una checklist pratica:

  • Usa un utente in sola lettura (nessun INSERT/UPDATE/DELETE, nessuna modifica di schema).
  • Imposta timeout per ruolo per query lunghe e sessioni inattive.
  • Limita il numero massimo di connessioni per utenti di reporting a un valore sicuro.
  • Restringi l'accesso solo agli schemi e alle tabelle di cui una dashboard ha bisogno.
  • Maschera o escludi colonne sensibili (PII, segreti, token) dalle viste di reporting.

Se devi mostrare dati parziali dei clienti, non fare affidamento sul fatto che “le persone staranno attente”. Crea viste di reporting che nascondono o hashano i campi sensibili, o mantieni uno schema di reporting curato. Quando i team costruiscono dashboard con AppMaster, usa la stringa di connessione della replica e l'utente dedicato di reporting così l'app generata legge in sicurezza senza toccare i permessi di scrittura di produzione.

Questi controlli mantengono le repliche PostgreSQL per il reporting veloci, prevedibili e molto più difficili da abusare.

Monitoraggio per evitare sorprese nelle dashboard

Un dashboard su più piattaforme
Crea dashboard web e mobile che leggono dallo stesso database di reporting.
Costruisci in AppMaster

Una replica aiuta solo se si comporta in modo prevedibile. Le due cose che solitamente sorprendono i team sono il replication lag silenzioso (le dashboard appaiono “sbagliate”) e i picchi di risorse sulla replica (le dashboard diventano lente). Il monitoraggio dovrebbe intercettare entrambi prima che lo facciano gli utenti.

Inizia misurando il lag e concordando cosa significa “abbastanza fresco” per il tuo business. Per molte dashboard di reporting 30-120 secondi vanno bene. Per altre (come inventario o frodi), anche 5 secondi possono essere troppi. Qualunque sia la soglia, rendila un numero visibile e crea allarmi su di essa.

Ecco segnali pratici da osservare per repliche PostgreSQL per reporting:

  • Replication lag (tempo e byte). Allerta quando supera la tua soglia per alcuni minuti, non solo su un singolo spike.
  • Salute della replica: pressione su CPU, memoria e I/O di lettura disco nelle ore di punta del reporting.
  • Saturazione delle connessioni sulla replica (troppi sessioni di dashboard possono sembrare “il DB è lento”).
  • Query lente sulla replica, usando le statistiche e i log della replica stessa (non dare per scontato che il primario dica tutta la verità).
  • Autovacuum e bloat sulla replica. Le letture possono degradare quando tabelle o indici si ingrossano.

Il tracciamento delle query lente merita attenzione speciale. Un fallimento comune è una dashboard che funzionava in test ma diventa un “festival di full table scan” in produzione. Assicurati che la replica abbia lo stesso monitoraggio che usi per il primario, inclusi top query per tempo totale e per tempo medio.

Infine, decidi in anticipo cosa fa l'app quando la replica non è disponibile o è troppo indietro. Scegli un comportamento e implementalo in modo coerente:

  • Mostra un banner “dati ritardati” quando il lag è sopra la soglia.
  • Disabilita temporaneamente i grafici più pesanti e mantieni riepiloghi leggeri.
  • Ripiega su risultati in cache per un intervallo fisso (per esempio ultimi 15 minuti).
  • Dirottare letture critiche sul primario solo per schermate specifiche.
  • Mettere le dashboard in modalità manutenzione di sola lettura finché la replica non si riprende.

Se costruisci dashboard interne in AppMaster, tratta la replica come una sorgente dati separata: monitorala separatamente e progetta dashboard che degradino con grazia quando la freschezza o le prestazioni peggiorano.

Errori comuni e trappole da evitare

Consegna report senza stress al DB
Crea schermate di report interne rapidamente con una connessione separata in sola lettura.
Inizia a costruire

Una replica aiuta, ma non è un pulsante magico che rende il reporting gratuito. La maggior parte dei problemi nasce dal trattarla come un magazzino analitico illimitato e poi stupirsi quando le dashboard diventano lente o sbagliate.

Un errore frequente: anche le repliche possono sovraccaricarsi. Alcune scansioni su tabelle ampie, join pesanti o export con “SELECT *” possono spingere CPU e disco al limite e causare timeout. Se la replica è su hardware più piccolo del primario (comune per risparmiare), il rallentamento si vede ancora prima.

Ecco le trappole più dolorose:

  • Indirizzare schermate critiche in tempo reale alla replica. Se una dashboard serve a confermare un checkout appena completato o mostrare inventario live, il replication lag può far sembrare che i dati manchino.
  • Permettere agli strumenti BI di aprire troppe connessioni. Alcuni strumenti aggiornano molte tile contemporaneamente, e ogni tile può aprire la propria sessione. I picchi di connessioni possono far collassare una replica anche se ogni query singolarmente è “piccola”.
  • Pensare che gli indici bastino sempre. Un indice non risolve una query che legge milioni di righe, raggruppa sulle chiavi sbagliate o fa join senza limiti. La forma della query e il volume dei dati contano più di un indice in più.
  • Dimenticare che “veloce una volta” non è “veloce sempre”. Una query che va bene al mattino può rallentare quando i dati crescono o quando più persone aggiornano lo stesso report.
  • Non pianificare il comportamento in caso di failover. Durante un failover, una replica può essere promossa o sostituita, e i client possono incorrere in errori di sola lettura o endpoint obsoleti se non pianifichi lo switch.

Un esempio realistico: il tuo strumento BI aggiorna una pagina “ordini di oggi” ogni minuto. Se esegue cinque query pesanti per refresh e 20 persone la tengono aperta, sono 100 picchi di query pesanti al minuto. Il primario potrebbe restare al sicuro, ma la replica può comunque cedere.

Se costruisci dashboard interne con una piattaforma come AppMaster, tratta il database di reporting come un target separato con i suoi limiti di connessione e regole di “freschezza richiesta”, così gli utenti non dipendono accidentalmente da dati in ritardo.

Pattern di design che rendono il reporting più veloce su una replica

Una replica ti dà respiro, ma non rende automaticamente ogni dashboard veloce. I migliori risultati arrivano modellando le query di reporting in modo che facciano meno lavoro e in maniera più prevedibile. Questi pattern funzionano bene per repliche PostgreSQL per il reporting perché riducono scansioni pesanti e aggregazioni ripetute.

Separa il “livello di reporting"

Considera uno schema di reporting dedicato (per esempio reporting) che contiene viste stabili e tabelle di supporto. Questo evita che gli strumenti BI colpiscano direttamente le tabelle transazionali e ti dà un posto unico da ottimizzare. Una buona vista di reporting nasconde anche join intricati così la query della dashboard resta semplice.

Pre-aggregare le cose costose

Se una dashboard ricalcola gli stessi totali tutto il giorno (fatturato giornaliero, ordini per stato, top prodotti), smetti di calcolare da zero ad ogni caricamento. Costruisci tabelle di riepilogo o materialized view che contengono già quei numeri raggruppati.

Scelte comuni:

  • Rollup giornalieri o orari (per data, regione, canale)
  • Tabelle snapshot “ultimo conosciuto” (inventario, saldo conto)
  • Tabelle Top-N (prodotti migliori, clienti migliori)
  • Fact table con colonne denormalizzate per filtri più veloci

Aggiorna le metriche pesanti con pianificazioni

Aggiorna le pre-aggregazioni con job pianificati, idealmente fuori dalle ore di punta. Se il business può convivere con “aggiornato ogni 5 minuti”, puoi scambiare un piccolo ritardo per dashboard molto più veloci. Per dataset molto grandi, aggiornamenti incrementali (solo le righe nuove dall'ultima esecuzione) sono di solito più economici delle refresh complete.

Cache di ciò che gli utenti cliccano spesso

Se gli stessi widget vengono richiesti ripetutamente, memorizza i risultati a livello applicazione per un breve periodo (30-120 secondi spesso bastano). Per esempio, una tile “Vendite di oggi” può essere cache-ata per azienda o negozio. In strumenti come AppMaster, questo tipo di caching è spesso più semplice da inserire attorno all'endpoint API che alimenta la dashboard.

Una regola semplice: se una query è lenta e popolare, pre-aggregala, mettici una cache o entrambe le cose.

Un esempio realistico: reporting vendite senza rallentare il checkout

Pianifica il lag con grazia
Disegna un piano di fallback semplice quando le repliche sono in ritardo così gli utenti vedono lo stato.
Prova a costruire

Immagina una piccola app e-commerce. Il database principale gestisce login, carrelli, pagamenti e aggiornamenti degli ordini tutto il giorno. Allo stesso tempo, il team vuole una dashboard che mostri fatturato orario, top prodotti e rimborsi.

Prima di qualsiasi cambiamento, la dashboard esegue query pesanti sul database primario. Verso fine mese, qualcuno apre un grafico “ultimi 30 giorni per prodotto” e scandaglia una grande porzione della tabella ordini. Il checkout inizia a sentirsi lento perché quelle query di reporting competono per CPU, memoria e letture disco.

La soluzione è semplice: sposta le letture della dashboard su una replica. Con repliche PostgreSQL per reporting, il primario continua a gestire scritture veloci, mentre la replica risponde alle letture lunghe. La dashboard punta alla stringa di connessione della replica, non al primario.

Il team imposta anche regole di freschezza chiare così nessuno si aspetta numeri perfettamente in tempo reale:

  • Mostra “Dati aggiornati X minuti fa” sulla dashboard
  • Permetti fino a 5 minuti di ritardo durante le ore normali
  • Se il lag supera i 10 minuti, passa la dashboard in “modalità ritardata” e sospendi i grafici più pesanti
  • Mantieni checkout e aggiornamenti ordini sempre sul primario

Dopo il cambiamento, l'effetto è evidente. Il checkout rimane stabile anche durante i picchi di report, e i grafici si caricano rapidamente perché non competono più con le transazioni.

Quello che gli utenti devono capire è semplice: la dashboard è “near real time”, non una fonte di verità per gli ultimi 10 secondi. Se qualcuno ha bisogno di totali esatti per riconciliazioni, dovrebbe eseguire un export pianificato o un report di fine giornata.

Se costruisci l'app con una piattaforma come AppMaster, tratta il reporting come una connessione separata in sola lettura fin da subito così i flussi transazionali rimangono prevedibili.

Controlli rapidi e prossimi passi

Prima di puntare le dashboard su una replica, fai un rapido controllo di buon senso. Alcune piccole impostazioni e abitudini prevengono le sorprese più comuni: numeri obsoleti, timeout e scritture accidentali.

Ecco una checklist rapida da configurare prima di inviare traffico a una replica:

  • Rendi le connessioni di reporting in sola lettura (usa un utente dedicato e applica transazioni read-only).
  • Separa il reporting dal traffico applicativo (pool di connessioni dedicato e limiti sensati).
  • Conferma che la replica abbia gli indici di cui le dashboard dipendono (le repliche copiano gli indici, ma verifica di non aver perso modifiche recenti).
  • Imposta statement e lock timeout per le query di reporting così una chart mal fatta non blocchi tutto.
  • Valida che i grafici tollerino piccoli ritardi (mostra timestamp “al” o arrotonda ai minuti quando serve).

Una volta che il traffico scorre, tratta il monitoraggio come una routine leggera settimanale, non come un incendio da spegnere. Questo è particolarmente vero per repliche PostgreSQL per il reporting, dove “ha funzionato ieri” può cambiare rapidamente quando i volumi di dati crescono.

Checklist di monitoraggio settimanale (10 minuti):

  • Replication lag: osserva il lag tipico e i peggiori spike durante le ore di punta.
  • Query lente: traccia i peggiori per tempo totale, non solo singole esecuzioni lente.
  • Connessioni: controlla max connections, saturazione del pool e pile di connessioni inattive.
  • Disco e CPU: le repliche possono diventare collo di bottiglia sullo storage durante grandi scansioni.
  • Query fallite: cerca timeout, statement annullati o errori di permesso.

I passi successivi riguardano soprattutto regole di instradamento e un piano di fallback. Decidi quali endpoint sono sempre sicuri da leggere dalla replica (dashboards, export, report admin) e quali devono rimanere sul primario (tutto ciò che deve essere up-to-the-second). Definisci cosa accade quando il lag supera il limite: mostra un banner di avviso, rimappa alcune letture sul primario o disattiva temporaneamente i grafici più pesanti.

Se costruisci dashboard o strumenti admin, AppMaster può essere un modo pratico per pubblicarli rapidamente mentre punti le schermate di reporting a una replica così il tuo core transazionale resta fluido.

Facile da avviare
Creare qualcosa di straordinario

Sperimenta con AppMaster con un piano gratuito.
Quando sarai pronto potrai scegliere l'abbonamento appropriato.

Iniziare