Documentazione tecnica
Installazione dell'ambiente
La procedura completa per installare la piattaforma MyTown: prerequisiti, database, librerie, microservizi, portale, app e scheduler dei job. Vedi anche l'architettura della piattaforma · Torna ai download
Installazione
Prerequisiti
- JDK 21 e Maven 3.9+ (backend)
- Node.js 22 LTS e npm (frontend)
- PostgreSQL 16 (database)
- Apache Tomcat 10.1+ (deploy dei WAR)
1. Database
Il repository database contiene la procedura di installazione
from-scratch in install/ (DDL completi dei 9 database, seed di bootstrap
per menu/ruoli/traduzioni/cataloghi, creazione dell'amministratore e del
portale) — vedi database/install/README.md:
export DB_PASSWORD='...' ADMIN_MAIL='...' ADMIN_PASSWORD='...' PORTAL_URL='https://...'
sudo -u postgres ./install.sh
Le cartelle schemas/, functions/, views/, migrations/ documentano
l'evoluzione incrementale (utili per aggiornare un'installazione esistente,
non per la prima installazione).
I database devono essere inesistenti o vuoti:
install.shnon è idempotente su un database già popolato.
2. Librerie condivise
I microservizi dipendono da tre librerie com.kondorcs non pubblicate su
Maven Central: installarle nel repository Maven locale in quest'ordine:
mvn -f kondorcs-utils/pom.xml clean install -DskipTests
mvn -f kondorcs-jwt/pom.xml clean install -DskipTests
mvn -f kondorcs-model/pom.xml clean install -DskipTests
3. Microservizi Spring
Ogni servizio carica la configurazione da
classpath:config/<company>/<env>.application.properties, selezionata con due
proprietà JVM:
-Dspring.profiles.company=<cartella>(es.example)-Dspring.profiles.active=<dev|test|prod>
Ogni repository include src/main/resources/config/example/ con tutti i
parametri e placeholder al posto di credenziali e host: copiare la cartella
example in una cartella con il nome della propria installazione (es.
config/miaazienda/), compilare i valori (connessione DB, jwt.secret,
SMTP, log) e ricompilare.
Il
jwt.secretdeve essere identico su tutti i servizi della stessa installazione e diverso per ogni installazione (base64, almeno 64 byte).
Build e deploy:
mvn -f ws_spring_portal_login/pom.xml clean package -DskipTests
# ... per ogni servizio; i WAR in target/ vanno deployati su Tomcat
In setenv.sh/setenv.bat di Tomcat impostare:
JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.company=miaazienda -Dspring.profiles.active=prod"
Permessi dei file generati. Alcuni servizi scrivono file destinati al download (PDF, Excel, ZIP) sotto la cartella del portale (
pathTemp, per impostazione predefinita<docroot>/assets/temp), che vengono poi serviti dal web server. Se web server e Tomcat girano con utenti diversi, quei file devono restare leggibili:catalina.shimponeumask 0027(file640) salvo che la variabile d'ambienteUMASKsia valorizzata, e il download risponderebbe 403. Impostare quindiUMASK=0022nell'ambiente di Tomcat (con systemd,Environment="UMASK=0022"oltre aUMask=0022), oppure far girare il web server con un utente del gruppo di Tomcat.
Cartelle di lavoro
I servizi non creano le cartelle in cui scrivono: se una manca, la
generazione del file termina con FileNotFoundException … (No such file or
directory). Vanno create in anticipo e devono appartenere all'utente di Tomcat.
I percorsi sono quelli delle config/example: sono composti da una radice più
un sottopercorso, quindi vanno creati anche i livelli intermedi.
| Proprietà (servizio) | Percorso di esempio | Contenuto |
|---|---|---|
pathTemp (tutti) |
<docroot>/assets/temp |
file generati per il download (PDF, Excel, ZIP) |
pathLogo, pathTemplate (cmp) |
<docroot>/assets/images, …/assets/templates |
logo azienda, template documenti |
file_upload_destination_path (cmp) |
/repository |
radice degli archivi del gestionale |
+ qrcode_file_upload_path |
/repository/qrcode |
QR code di cantieri e sedi |
+ xml_file_upload_path |
/repository/import_xml |
fatture XML importate |
+ xml_fussi_path |
/repository/flussi |
flussi bancari |
+ riconciliazioni_pdf_path |
/repository/riconciliazioni |
riconciliazioni |
file_upload_destination_path (documentary) |
/var/www/allegati + /pdf, /qrcode |
archivio documentale |
image_upload_destination_path (ecommerce) |
/repository/onlineshop |
immagini dei prodotti |
image_upload_destination_path (bakeka) |
/var/www/bacheca/<area> |
foto e audio della bacheca |
image_upload_temp_path (ecommerce, bakeka) |
<docroot>/assets/temp/<area> |
upload temporanei |
Le cartelle sotto la docroot del portale (
assets/…) vengono cancellate a ogni deploy del frontend: ricrearle subito dopo, insieme ai permessi.
4. Portale web
cd portale_angular_18
npm ci
npm run build:prod # output in dist/browser
Per lo sviluppo locale: copiare src/environments/environment.local.ts.example
in src/environments/environment.local.ts, configurare gli URL dei servizi e
usare npm run start:local.
Documentazione delle API (opzionale)
Ogni WAR pubblica la propria specifica OpenAPI e la propria pagina Swagger UI:
https://<host>/<servizio>/openapi.jsonhttps://<host>/<servizio>/swagger-ui.html
La pagina del singolo servizio prende gli asset di Swagger UI da /api-docs/,
che è la cartella platform/api copiata nella docroot del portale:
cp -r platform/api /var/www/html/api-docs
Così si ottiene anche https://<host>/api-docs/, la Swagger UI unica con il
selettore del servizio. Essendo dentro la docroot, il deploy del frontend la
cancella: va ricopiata dopo ogni deploy, come le cartelle assets/….
Senza questo passo i servizi restano funzionanti e openapi.json resta
scaricabile: solo l'interfaccia grafica non si carica, e la pagina lo dice.
Le specifiche descrivono l'intera superficie API. Non contengono segreti — il codice è pubblico — ma se preferisci non esporle, blocca
/openapi.jsone/swagger-ui.htmlnel reverse proxy: nessuna funzione della piattaforma le usa.
5. App mobile
cd app-data-smart
npm ci
npm run build:mytown # web build + capacitor sync
Per generare l'APK Android serve un proprio progetto Firebase: creare
android/app/google-services.json (vedi google-services.json.example se
presente, o la console Firebase) e compilare con Android Studio / Gradle.
6. Scheduler (job pianificati)
Lo scheduler è incluso nella distribuzione (Windows / .NET Framework):
kondorcs.scheduleservices— l'hostKCSSchedule.exe(servizio Windows); requisito: .NET Framework 4.8 Developer Pack, build con MSBuild (VS 2022)kondorcs.schedulelibrary.datasmart— job Notificatore (codausers_notifye token SMS del 2FA), ReportFotovoltaico, CreditoSmsHostingkondorcs.schedulelibrary.aifileprocessor— estrazione dati da PDF documentali (certificati di pagamento, SAL, PDF generici)
Lo scheduler richiede Windows e un'istanza di Microsoft SQL Server (anche Express) per lo store della pianificazione (quali job, quando, con quali parametri) — separato dai database PostgreSQL della piattaforma. Ogni job legge/ scrive comunque i dati applicativi su PostgreSQL tramite la propria connection string. Procedura completa da zero:
a) Creare il job-store su SQL Server (script nel repo database):
sqlcmd -S <sqlserver> -E -Q "CREATE DATABASE KondorCS"
sqlcmd -S <sqlserver> -E -d KondorCS -i database/install-scheduler/10_schema_scheduler_sqlserver.sql
Crea 3 tabelle (KCS_ScheduleLibrarys, KCS_ScheduleConfigLibrarys,
KCS_ScheduleLogs) e 2 stored procedure (KCS_ScheduleGetLibrarys,
KCS_ScheduleSetLog).
b) Registrare il job Notificatore (notifiche + OTP del 2FA). Aprire
database/install-scheduler/20_seed_scheduler_notificatore.sql, sostituire i
placeholder (<mittente>, <PG_HOST>, <PG_USER>, <PG_PASSWORD> — la
connection string PostgreSQL verso il proprio KCS-Portal), poi:
sqlcmd -S <sqlserver> -E -d KondorCS -i database/install-scheduler/20_seed_scheduler_notificatore.sql
c) Puntare l'host al job-store — la connection string verso SQL Server è
letta dal registro di Windows (non dal .config dell'host):
reg add "HKLM\SOFTWARE\KondorCS\DATA" /v ConnDB /t REG_SZ ^
/d "Data Source=<sqlserver>;Initial Catalog=KondorCS;User ID=<sql_user>;Password=<sql_password>"
d) Buildare e installare l'host (kondorcs.scheduleservices): compilare in
Release (MSBuild, .NET Framework 4.8), copiare l'output dell'host + le DLL dei
job (kondorcs.schedulelibrary.*, con le loro dipendenze) nella cartella di
installazione (es. C:\KondorCS\Services\ScheduleServices\) e registrare il
servizio con installutil KCSSchedule.exe (vedi i README dei singoli repo).
e) Configurare l'account SMTP per l'OTP (vedi punto sotto), quindi avviare il servizio:
sc start KCSScheduleService
Consegna OTP del login a due fattori. Il job Notificatore invia il codice
OTP via email, leggendo l'account SMTP dalla tabella config_mail (database
PostgreSQL KCS-Portal), riga con cfm_type = 'LOGIN_TOKEN' e
cfm_active = true (cfm_server, cfm_port, cfm_ssl, cfm_user,
cfm_password, cfm_text con il segnaposto [@Token]). L'account SMTP va
fornito dall'installazione: la distribuzione non include alcuna casella. La
password in cfm_password è cifrata AES-ECB/PKCS7 (base64) con la chiave
definita nel job; configurarla dalla UI di amministrazione (sezione Email) oppure
inserendo direttamente la riga cifrata.
Verifica. Al login, dopo il primo fattore, l'OTP deve arrivare via email; in
KCS_ScheduleLogs compare --01-- Library Started e Invio SMS Token N di N
senza errori. Un 535 authentication failed indica credenziali/relay SMTP non
validi lato mail server, non un problema dello scheduler.
Funzione non inclusa: la scadenza automatica di prenotazioni/preventivi e i promemoria programmatici di BizAppointments facevano parte di un job del modulo enterprise; vanno forniti dall'installazione (vedi ARCHITECTURE.md).
Login a due fattori senza scheduler: il codice OTP viene recapitato dal job Notificatore. Finché lo scheduler non è attivo, l'OTP si legge dal database
KCS-Portal:SELECT * FROM contact_login_bidtoken_get('<email utente>');
