| Hostname | VPS Gemini9 |
| IP Pubblico | 185.198.244.81 |
| IP VPN | 10.0.0.1 |
| Dominio CRM | crm.gemini9.it |
| SSH | Porta 2222, user claudeuser — ssh -p 2222 claudeuser@185.198.244.81 |
| aaPanel | https://10.0.0.1:15685/a8f0d4e9 (solo VPN) |
| Timezone | UTC (Roma calcolato nel codice) |
| Titolare | Danilo Bertone — Agente commerciale termoidraulica (Latina/Frosinone) |
Browser → Nginx (443/80)
└─ /api/* → Backend CRM Python (127.0.0.1:9099) → PostgreSQL (Docker)
└─ /salute/* → Salute API Python (127.0.0.1:9098)
└─ /mcp/* → MCP Salute Python (127.0.0.1:9096)
└─ /mcp-ops/* → MCP Operations Python (127.0.0.1:9091)
└─ /gps/* → Traccar-CRM Python (127.0.0.1:9093)
└─ / → Frontend HTML statico (index.html, salute.html, gps.html)
Tutti i backend sono bindati a 127.0.0.1 e accessibili solo tramite reverse proxy Nginx. Il database PostgreSQL gira in Docker (container dk_nocodb-nocodb-db-1) sulla rete interna 172.23.0.2:5432.
| Dispositivo | URL | Note |
|---|---|---|
| Mac | https://crm.gemini9.it | Aggiunto in /etc/hosts → 10.0.0.1 |
| iPhone | http://10.0.0.1 | Safari forza HTTPS, usare IP diretto |
| Generico (VPN) | https://crm.gemini9.it | Richiede connessione VPN attiva |
Vaillant, Euroacque, Resideo, Sunerg, Uponor, GF, Ici Caldaie
| Servizio | Porta | Bind | Stato | Descrizione |
|---|---|---|---|---|
crm-link-proxy | 9099 | 127.0.0.1 | Attivo | Backend CRM principale |
salute-api | 9098 | 127.0.0.1 | Attivo | API Salute (uscite, body, workout) |
whatsapp-bridge | 9097 | 127.0.0.1 | Attivo | Bridge WhatsApp (Baileys/Node.js) |
mcp-salute | 9096 | 127.0.0.1 | Attivo | MCP Server Salute (16 tool) |
mcp-memory | 9095 | 127.0.0.1 | Attivo | MCP Memory Server |
mcp-crm | 9094 | 127.0.0.1 | Attivo | MCP CRM Direttore |
traccar-crm | 9093 | 127.0.0.1 | Attivo | Bridge Traccar-CRM (GPS) |
mcp-operations | 9091 | 127.0.0.1 | Attivo | MCP Operations (Paperclip) |
paperclip | 3100/3101 | 0.0.0.0 | Attivo | Paperclip AI (API 3100, UI 3101) |
lamu-bot | — | — | Attivo | Bot Telegram Lamù |
paperclip-webhook | 9089 | 127.0.0.1 | Vecchio | Webhook bridge (sostituito da claude_local) |
| Path | Destinazione |
|---|---|
/api/* | 127.0.0.1:9099 |
/salute/* | 127.0.0.1:9098 |
/mcp/* | 127.0.0.1:9096 |
/mcp-ops/* | 127.0.0.1:9091 |
/gps/* | 127.0.0.1:9093 |
/.well-known/oauth* | 127.0.0.1:9096 |
| Container | Porte | Rete | Descrizione |
|---|---|---|---|
dk_nocodb-nocodb-db-1 | 5432 | 172.23.0.2 (dk_nocodb_default) | PostgreSQL (database CRM + Salute) |
dk_openclaw-openclaw-gateway-1 | 18789 | 172.19.x.x (dk_openclaw_default) | OpenClaw bot |
| Traccar | 8082, 5055 | — | Traccar GPS server |
| Wallabag + MariaDB + Redis | 8888 | wallabag_net | Wallabag News reader |
/www/server/panel/vhost/nginx/crm.gemini9.it.conf/www/server/panel/vhost/nginx/paperclip.confsudo /www/server/nginx/sbin/nginx -s reload| CRM principale | /www/wwwroot/crm.gemini9.it/index.html (~531 KB) |
| Salute | /www/wwwroot/crm.gemini9.it/salute.html (~44 KB) |
| GPS | /www/wwwroot/crm.gemini9.it/gps.html |
Stile UI: Apple/macOS Ventura con font Inter, sidebar gradiente blu notte, icone Lucide SVG, glassmorphism leggero, animazioni fadeSlideIn. Colore accent #007AFF.
| File | /www/wwwroot/crm.gemini9.it/link_contatto.py |
| Porta | 9099 (bind 127.0.0.1) |
| Servizio | crm-link-proxy |
| Handler | Classe con do_GET() e do_POST() |
sudo systemctl restart crm-link-proxy. Se la porta è occupata: fuser -k 9099/tcp poi restart.
| Host | 172.23.0.2:5432 (Docker) |
| Database | nocodb |
| Schema | ppc8j1wrkypcy4m |
| Tabelle | 26 totali (17 CRM + 9 Salute) — aggiunte progetti_commerciali e task_commerciali (27/05/2026) |
| Connection Pool | psycopg2 ThreadedConnectionPool (min=2, max=10) |
/www/wwwroot/crm.gemini9.it/.env (chmod 600, owner www)env_helper.py → load_env(), env(), db_conn_string(), get_db(), put_db()575 clienti, 767 contatti (dopo import Google contacts del 03-04/04/2026).
| URL | https://rcm.mysalescrm1.it/admin/index.php |
| Script sync | /opt/sync-crm-vecchio.py (filtra solo autore Danilo id=2) |
Modulo per tracciare progetti commerciali multi-step (es. apertura centro assistenza, sviluppo rete installatori).
| Tabella NocoDB | progetti_commerciali |
| Table ID | 6ng93bz3qkprylkh |
| Schema PostgreSQL | ppc8j1wrkypcy4m |
| Campi chiave | nome, descrizione, mandante, stato, data_inizio, data_fine_prevista, vault_path, note |
| Stati possibili | in_corso, completato, sospeso, annullato |
sort=-Data%20Inizio — NON sort=-data_inizio (causa ERR_FIELD_NOT_FOUND → 502).
Task operativi collegati a clienti, zone o progetti. Visibili nel CRM come lista filtrabile per progetto.
| Tabella NocoDB | task_commerciali |
| Table ID | gog74qdw2ewjaafs |
| Campi chiave | titolo, descrizione, cliente, zona, progetto_id, stato, priorita, scadenza, note |
| MCP tools | crea_task, task_per_zona, chiudi_task |
L'infrastruttura MCP (Model Context Protocol) espone i dati del CRM e dei servizi come tool utilizzabili da Claude e dagli agenti Paperclip.
| File | /www/wwwroot/crm.gemini9.it/mcp_crm.py |
| Servizio | mcp-crm |
| Porta | 9094 |
Tool disponibili (aggiornato 27/05/2026):
| File | /www/wwwroot/crm.gemini9.it/mcp_salute.py |
| Servizio | mcp-salute |
| Porta | 9096 |
| URL pubblica | https://crm.gemini9.it/mcp/ |
| Protocollo | JSON-RPC 2.0 over Streamable HTTP |
| Auth | OAuth 2.0 (dynamic registration, authorization code + PKCE) |
16 tool: get/post uscite, body, workout, alimentazione, integratori, acqua, info, riepilogo, sync.
| Servizio | mcp-memory |
| Porta | 9095 |
Tool: memory_read, memory_write, memory_append, memory_list, memory_search. Gestisce file memory persistenti (PROFILE, ARCHITECTURE, PROJECTS, ecc.).
| File | /www/wwwroot/crm.gemini9.it/mcp_operations.py |
| Servizio | mcp-operations |
| Porta | 9091 |
| Proxy Nginx | /mcp-ops/* |
22 tool suddivisi per area: Finance (5), Marketing (5), IT (7), Email (5). Usato dagli agenti Paperclip.
| UI Web | http://10.0.0.1:3101 (solo VPN, porta aperta per 10.0.0.0/24) |
| API | http://localhost:3100/api (dalla VPS) |
| Installazione | /opt/paperclip/ |
| Servizio | systemd paperclip |
| DB | PGlite embedded ~/.paperclip/instances/default/db |
| Modello AI | claude-haiku-4-5-20251001 per tutti gli agenti |
Gemini9 - Danilo Bertone
ID: aee1074a-ab88-4588-81b4-bc847d696aa8
| Agente | Dipartimento | Ruolo |
|---|---|---|
| Executive Assistant | Chief of Operations | CEO role — coordina, legge email, classifica, smista |
| Sales Agent | Sales & Clients | Gestione clienti, vendite, CRM |
| Finance Agent | Finance & Billing | Fatture, scadenze, contabilità |
| Marketing Agent | Outreach & Campaigns | Campagne, outreach, comunicazione |
| IT Agent | Infrastructure & Monitoring | Monitoraggio servizi, infrastruttura |
| Project Manager | Proposals & Follow-up | RDO, proposte, tracking follow-up |
EnvironmentAGENTS.md in ~/.paperclip/instances/default/companies/{company_id}/agents/{agent_id}/instructions/claude_local per le operazioni (il vecchio webhook bridge su porta 9089 è stato sostituito)/opt/backups/pre-paperclip/ (DB, file CRM, nginx, systemd, Docker)paperclip-data (~116 MB) su Google Drive| Nome | Lamù |
| Username | @lamu_gemini9_bot |
| Chat ID Danilo | 292335472 |
| File | /opt/lamu-fuel-bot/bot.py (v2, riscritto da zero) |
| Servizio | lamu-bot |
| Comando avvio | python3 -u /opt/lamu-fuel-bot/bot.py |
| Backup vecchio | /opt/lamu-fuel-bot/bot.py.bak |
| Comando | Descrizione |
|---|---|
/help | Lista comandi |
/pieno | Rifornimento carburante (2 foto, analisi Gemini Flash) |
/ultimo | Ultimo rifornimento |
/stats | Statistiche carburante |
/rdo | Lista RDO aperte |
rdo Cliente rif Riferimento desc | Crea nuova RDO |
/briefing | Briefing giornaliero (via MCP Operations) |
/status | Stato servizi |
/annulla | Annulla operazione in corso |
d.bertone@agenziarcm.com/www/wwwroot/crm.gemini9.it/.gmail_token.json| Account | d.bertone@agenziarcm.com (Google Workspace) |
| Client ID | 275001080436-rss2f69kdvpk5it9gm1c8p4k1pvs5kmj.apps.googleusercontent.com |
| Client Secret | In .env (variabile GOOGLE_CLIENT_SECRET) |
| Token file | /www/wwwroot/crm.gemini9.it/.gmail_token.json (chmod 600) |
| Redirect URI | http://localhost |
| Scope | gmail.readonly, gmail.send, gmail.modify |
Il refresh_token è permanente. L'access_token scade ogni ora e si rinnova automaticamente.
| Agente Paperclip | Uso Gmail |
|---|---|
| Executive Assistant | Legge email, classifica, smista |
| Project Manager | Cerca risposte RDO, invia RDO a Stefano |
| Finance Agent | Cerca fatture, scadenze |
Le RDO sono richieste d'offerta inviate all'ufficio tecnico di Stefano per ottenere preventivi dai mandanti. Possono essere create da Telegram (Lamù) o intercettate dalle email dei clienti.
| Destinatario PROD | ufficiotecnico@agenziarcm.com (Stefano) |
| Destinatario TEST | danilo@dbertone.com |
| Mittente | d.bertone@agenziarcm.com (OAuth gmail.send) |
| Oggetto | RDO - {mandante1/mandante2} - {cliente} - rif {riferimento} |
| Corpo | Inizia SEMPRE con “Ciao Stefano,” — firma “Grazie\nDanilo” |
Vaillant, Euroacque, Resideo, Sunerg, Uponor, GF, Ici Caldaie
rdo NomeCliente rif Riferimento descrizione + eventuale allegatorichiesta → inviata_a_stefano → in_lavorazione → completata → inviata_al_cliente
| Tabella | RDO_Offerte |
| Campi chiave | email_body, gmail_message_id |
| API | /api/rdo con filtri stato/mandante |
Il frontend CRM ha una sezione dedicata RDO con: nav item nella sidebar, funzioni loadRdo() e showRdoDetail(), modale dettaglio con link “Apri in Gmail” (usa gmail_message_id salvato nel DB).
| File | /opt/whatsapp-bridge/server.js |
| Porta | 9097 (bind 127.0.0.1) |
| Servizio | whatsapp-bridge |
| Tecnologia | Node.js + Baileys |
Il bridge ha due funzioni:
whatsapp_messaggiOgni messaggio viene registrato nella tabella whatsapp_messaggi (schema ppc8j1wrkypcy4m su NocoDB Postgres). Ad oggi ~19.800 messaggi archiviati dal 27/05/2026.
| Campo | Contenuto |
|---|---|
direzione | in (ricevuto) / out (inviato) |
numero_pulito, jid | numero mittente/destinatario |
testo, tipo | testo del messaggio + tipo (text/image/audio/document/video) |
contatto_id, cliente_id | aggancio automatico a contatto e cliente CRM |
classificazione, azione_suggerita, urgente | esito della classificazione keyword |
ts | timestamp |
direzione = 'out') → da questa data le conversazioni sono archiviate complete, domanda e risposta.
Alla ricezione, il bridge cerca il numero (ultime 9 cifre) tra Cellulare/Telefono dei contatti 03_Contatti e, se lo trova, collega il messaggio a contatto e cliente. I numeri non riconosciuti restano senza aggancio finché il contatto non viene creato/aggiornato nel CRM.
Ogni messaggio in entrata con testo viene classificato istantaneamente per parole chiave:
| Classe | Azione suggerita |
|---|---|
richiesta_ordine | Preparare offerta/preventivo |
conferma_offerta | Aggiornare offerta CRM → Chiusa vinta |
rifiuto_offerta | Aggiornare offerta CRM → Chiusa persa + motivo |
pagamento urgente | Verificare posizione pagamenti / Affidabilità |
reclamo | Gestire contestazione |
appuntamento | Fissare/annotare incontro |
generico | — |
whatsapp_messaggi).rilevante = false con nota, per escluderli dalle analisi.| Web UI | http://10.0.0.1:8082 (solo VPN) |
| Porta GPS | 5055 (TCP/UDP, solo VPN) |
| Docker compose | /opt/traccar/docker-compose.yml |
| Data | /opt/traccar/data/ |
| Device | iphone-danilo (uniqueId: 123456, deviceId: 1) |
| File | /www/wwwroot/crm.gemini9.it/traccar_crm.py |
| Servizio | traccar-crm |
Endpoints: /position, /route, /km, /nearby, /visits-today, /map-data, /health
/opt/gps_auto_visits.pyFile: /www/wwwroot/crm.gemini9.it/gps.html — Mappa con posizioni, percorsi e visite.
| URL | http://10.0.0.1:18789 (solo VPN) |
| Container | dk_openclaw-openclaw-gateway-1 |
| Rete Docker | dk_openclaw_default (172.19.x.x) |
| Docker Compose | /www/dk_project/dk_app/dk_openclaw/docker-compose.yml |
| Workspace/Memory | /www/dk_project/dk_app/dk_openclaw/data/work/ |
| Python | 3.11.2, psycopg2 2.9.5 |
OpenClaw usa un token Telegram separato (bot Lamù vecchio). Non toccare questo token.
dk_openclaw_default che a dk_nocodb_default per raggiungere il DB.Il path /opt/lamu-fuel-bot è montato rw con permessi 777 dentro il container.
| Config | /etc/wireguard/wg0.conf |
| Hub | VPS Gemini9 porta 51820/udp |
| MTU | 1280 (previene disconnessioni su download grossi) |
| PersistentKeepalive | 25 su iPhone, Mac, Mac Roma, iPad |
| IP VPN | Dispositivo | Note |
|---|---|---|
10.0.0.1 | VPS Gemini9 | Hub centrale |
10.0.0.2 | VPS Nextcloud | 185.198.244.34 — cloud.gemini9.it |
10.0.0.3 | Server Roma | Proxmox + Home Assistant (http://10.0.0.3:8123) |
10.0.0.4 | HA Cercepiccola #1 | IP locale 192.168.1.113, wg-quick a livello sistema |
10.0.0.5 | HA Cercepiccola #2 | IP locale 192.168.178.24, wg-quick a livello sistema |
10.0.0.6 | iPhone | Keepalive 25 |
10.0.0.7 | Mac | Keepalive 25 |
10.0.0.8 | Mac Roma | Keepalive 25 |
10.0.0.9 | iPad | Keepalive 25 |
wg-quick), NON come addon Docker. La configurazione è in /homeassistant/wg0.conf con script di avvio /homeassistant/wireguard-start.sh e automazione HA “Start WireGuard” al boot con delay 30s.
22, 80, 443, 8888, 15685
| Account | d.bertone@agenziarcm.com |
| Percorso | Drive → VPS-Gemini → CRM_Backups |
| Folder ID | 1vzABb6l2yE1nS44s9zZKv-EJ2xa6QTM- |
| Token Drive | /www/wwwroot/crm.gemini9.it/.drive_token.json (scope drive) |
| Upload script | /www/wwwroot/crm.gemini9.it/drive_upload.py |
| Nome File | Contenuto |
|---|---|
crm-code | Codice CRM Python, HTML, .env, .gmail_token.json |
nocodb-sqldump | Dump SQL database PostgreSQL completo (incl. progetti_commerciali e task_commerciali) |
opt-scripts | Lamù bot, WhatsApp bridge, backup scripts, GPS scripts |
nginx | Config nginx tutti i vhost |
configs | Systemd services, WireGuard |
docs | Manuale |
paperclip-data | DB Paperclip, agenti, skill, company (~116 MB) |
secondbrain | Vault Second Brain — /home/danilo/SecondBrain/ (schede cliente, wiki, progetti, decisioni, giornalieri) |
| Nome File | Contenuto |
|---|---|
openclaw | Dati OpenClaw workspace, memory, config (~22 MB) |
| Componente | Coperto dal backup? | Dove |
|---|---|---|
progetti_commerciali | ✅ Sì | nocodb-sqldump — dump PostgreSQL completo |
task_commerciali | ✅ Sì | nocodb-sqldump — dump PostgreSQL completo |
mcp_crm.py (nuovi tool) | ✅ Sì | crm-code |
docs_vps.html (manuale) | ✅ Sì | docs |
Vault Second Brain (/home/danilo/SecondBrain/) | ✅ Sì | secondbrain — tar diretto su VPS, upload su entrambe le cartelle Drive |
Il vault vive direttamente sul VPS in /home/danilo/SecondBrain/. Il backup è identico a quello di qualsiasi altra cartella: il VPS la tara e la carica su Google Drive ogni notte. Nessuna dipendenza dal Mac, nessuna configurazione aggiuntiva.
VPS (/home/danilo/SecondBrain/) ← vault autoritativo — già sul VPS
│
│ backup-crm.sh alle 01:00 (step 6b)
▼
/opt/backups/crm/secondbrain-YYYYMMDD.tar.gz
│
│ upload step 7 + 7b
▼
Google Drive → CRM_Backups/secondbrain-YYYYMMDD.tar.gz
Cartella personale dbertone76@gmail.com/secondbrain-YYYYMMDD.tar.gz
Aggiunto a /opt/backup-crm.sh:
# 6b. Vault Second Brain (direttamente sul VPS — /home/danilo/SecondBrain/)
tar czf "$BACKUP_DIR/secondbrain-${TIMESTAMP}.tar.gz" /home/danilo/SecondBrain/ 2>/dev/null
# Upload in step 7 (CRM_Backups) e step 7b (cartella personale):
python3 .../drive_upload.py "$BACKUP_DIR/secondbrain-${TIMESTAMP}.tar.gz" CRM_Backups
python3 .../drive_upload.py "$BACKUP_DIR/secondbrain-${TIMESTAMP}.tar.gz" "$PERSONAL_FOLDER"
# Pulizia: coperta dal wildcard *.tar.gz in step 8 (14 giorni)
tar xzf secondbrain-YYYYMMDD.tar.gz -C / — ripristina /home/danilo/SecondBrain/ esattamente com'era.
| File VPS/giorno | 9 (+ secondbrain) |
| Volume VPS/giorno | ~140 MB + vault (~64 KB attuale, crescerà) |
| Retention Drive | 15 file per tipo |
| Retention locale VPS | 14 giorni |
| Vault Second Brain | ✅ Configurato — backup automatico ogni notte |
| Dipendenza dal Mac | Nessuna — backup 100% VPS-initiated |
Scaricare tutti i file di backup dalla cartella Google Drive VPS-Gemini → CRM_Backups (account d.bertone@agenziarcm.com).
# Installa Docker, Docker Compose, Node.js 20, pnpm, Python 3, pip
apt update && apt upgrade -y
apt install docker.io docker-compose nodejs npm python3 python3-pip -y
npm install -g pnpm
tar xzf configs-*.tar.gz
cp etc/wireguard/wg0.conf /etc/wireguard/
systemctl enable wg-quick@wg0 && systemctl start wg-quick@wg0
# NocoDB (PostgreSQL)
docker-compose up -d nocodb
# Traccar GPS
cd /opt/traccar && docker-compose up -d
# Wallabag
docker-compose up -d wallabag wallabag-db wallabag-redis
gunzip nocodb-sqldump-*.sql.gz
# Restore nel container Docker PostgreSQL
docker exec -i dk_nocodb-nocodb-db-1 psql -U nocodb < nocodb-sqldump-*.sql
tar xzf crm-code-*.tar.gz -C /www/wwwroot/crm.gemini9.it/
chmod 600 /www/wwwroot/crm.gemini9.it/.env
chmod 600 /www/wwwroot/crm.gemini9.it/.gmail_token.json
tar xzf opt-scripts-*.tar.gz -C /opt/
tar xzf nginx-*.tar.gz -C /www/server/panel/vhost/nginx/
sudo /www/server/nginx/sbin/nginx -s reload
tar xzf configs-*.tar.gz
# Copia i .service files in /etc/systemd/system/
systemctl daemon-reload
cd /opt && git clone [repo-paperclip] paperclip
cd paperclip && pnpm install
tar xzf paperclip-data-*.tar.gz -C ~/.paperclip/
tar xzf openclaw-*.tar.gz -C /www/dk_project/dk_app/dk_openclaw/
docker restart dk_openclaw-openclaw-gateway-1
# Ricollegare a rete NocoDB + reinstallare psycopg2
systemctl start crm-link-proxy salute-api mcp-salute mcp-crm mcp-memory \
mcp-operations traccar-crm whatsapp-bridge paperclip lamu-bot
systemctl enable crm-link-proxy salute-api mcp-salute mcp-crm mcp-memory \
mcp-operations traccar-crm whatsapp-bridge paperclip lamu-bot
Il vault è in /home/danilo/SecondBrain/ sul VPS — il backup è in Google Drive come secondbrain-YYYYMMDD.tar.gz.
# Scarica da Drive: VPS-Gemini → CRM_Backups → secondbrain-YYYYMMDD.tar.gz
# Ripristina sul nuovo VPS:
tar xzf secondbrain-YYYYMMDD.tar.gz -C /
# La cartella /home/danilo/SecondBrain/ è ripristinata esattamente com'era
# Verifica progetti e task (aggiunti 27/05/2026)
docker exec dk_nocodb-nocodb-db-1 psql -U nocodb -d nocodb -c \
"SELECT count(*) FROM ppc8j1wrkypcy4m.progetti_commerciali;"
docker exec dk_nocodb-nocodb-db-1 psql -U nocodb -d nocodb -c \
"SELECT count(*) FROM ppc8j1wrkypcy4m.task_commerciali;"
| Problema | Soluzione |
|---|---|
| CRM non risponde | sudo systemctl restart crm-link-proxy |
| Porta 9099 occupata | fuser -k 9099/tcp poi systemctl restart crm-link-proxy |
| Salute API non risponde | sudo systemctl restart salute-api |
| MCP non risponde | sudo systemctl restart mcp-salute |
| WhatsApp ban | Aspettare 24-48h, poi rispettare limiti: max 50 msg/giorno con delay 2-4 min |
| iPhone 403 su CRM | Usare http://10.0.0.1 (Safari forza HTTPS su crm.gemini9.it) |
| Sync uscite senza GPS | Verificare che usi fileId (non spec_id) per download FIT |
| Uscite senza assist mode | ebike_assist_mode è nei RECORD del FIT, non negli eventi |
| OpenClaw non raggiunge DB dopo riavvio | Ricollegare container a rete dk_nocodb_default + reinstallare psycopg2 |
| aaPanel non accessibile | Verificare VPN attiva + usare User-Agent browser + RSA login + CSRF token |
| HA Cercepiccola VPN down dopo reboot | Verificare automazione HA “Start WireGuard” (delay 30s) + wg-quick a livello sistema |
| SSH da iPhone via VPN non funziona | Problema noto: SSH porta 2222 non raggiungibile da iPhone via VPN. Usare aaPanel o tunneling alternativo. |
| Lamù bot non risponde | sudo systemctl restart lamu-bot |
| Paperclip non risponde | sudo systemctl restart paperclip |
| Wallabag non carica notizie | Verificare cron /opt/wallabag-rss-fetch.sh (ogni 30 min, cron id 72 aaPanel) |
# Stato di tutti i servizi
systemctl status crm-link-proxy salute-api mcp-salute mcp-crm mcp-memory \
mcp-operations traccar-crm whatsapp-bridge paperclip lamu-bot
# Log di un servizio
journalctl -u crm-link-proxy -f --no-pager -n 50
# Verifica porte in ascolto
ss -tlnp | grep -E '909[0-9]|3100|3101'
# Stato Docker
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
# Test connessione DB
docker exec dk_nocodb-nocodb-db-1 psql -U nocodb -c "SELECT count(*) FROM ppc8j1wrkypcy4m.nc_acjx___Clienti;"
# Stato WireGuard
wg show
systemctl restart.env)Il Second Brain è il sistema di memoria e intelligenza operativa di Danilo, costruito su tre strati integrati che si completano senza sovrapporsi.
| Strato | Strumento | Cosa contiene |
|---|---|---|
| Vault | Obsidian — ~/SecondBrain/ | Il perché: contesto relazionale, decisioni, strategia, conoscenza elaborata |
| CRM | NocoDB + CRM Gemini9 | Il cosa: fatturato, ordini, visite, offerte, task, progetti |
| Agente | Claude Code + MCP | Il collegamento: legge entrambi, propone azioni, aggiorna entrambi |
~/SecondBrain/)index.md | Mappa di navigazione — START HERE |
CLAUDE.md | Istruzioni operative per Claude (regole, comandi, tool disponibili) |
Giornaliero/YYYY-MM-DD.md | Memoria a breve termine — sessioni del giorno, priorità, appreso |
Commerciale/Clienti/[Nome].md | Schede cliente: contesto relazionale, storico conversazioni, punti aperti |
Commerciale/Mandanti/[Nome].md | Schede mandante: strategia, condizioni, contatti chiave |
Wiki/Concetti/ | Conoscenza tecnica/di mercato elaborata |
Wiki/Progetti/ | Progetti commerciali multi-step attivi (narrativa + fasi) |
Libreria/decisioni.md | Tutte le decisioni importanti con rationale |
RAW/ | File grezzi da ingestare (PDF cataloghi, trascrizioni, note) — immutabili |
Skill/ | Definizioni comandi speciali (buongiorno, ingesta, ecc.) |
Il vault e il CRM si sincronizzano attraverso Claude + MCP, non attraverso copia diretta di dati.
| Flusso | Meccanismo | Esempio |
|---|---|---|
| CRM → Vault | Claude legge i dati CRM tramite MCP e li elabora in contesto qualitativo | briefing_cliente() → note strategiche nella scheda cliente |
| Vault → CRM | Claude aggiorna il CRM strutturato sulla base della narrativa vault | Nuova fase progetto in Wiki/Progetti/ → aggiorna_progetto() |
| Nuovo progetto | Crea pagina vault + record CRM + task | Wiki/Progetti/slug.md + crea_progetto() + crea_task() |
| Comando | Quando | Cosa fa Claude |
|---|---|---|
buongiorno |
Ogni mattina | Legge indice + Giornaliero, chiama list_events, riepilogo_visite, get_recovery_score, cerca email urgenti. Per ogni cliente in agenda: legge scheda vault + briefing_cliente() + task_per_zona(). Produce briefing strutturato: stato fisico, agenda con brief visita, task per zona, email urgenti. |
grazie per oggi |
Ogni sera | Fa 5 domande una alla volta (concluso / appreso / priorità domani / contesto prossima sessione / nuovi SOP), salva tutto nel Giornaliero, propone aggiornamento schede cliente menzionate. |
prepara visita [nome] |
Prima di una visita | Legge scheda vault cliente + chiama briefing_cliente() + task_per_zona(). Restituisce brief completo: storico ordini, mandanti, ultime visite, condizioni, note strategiche, task aperti. |
chiudi visita |
Dopo una visita | Registra esito + note, aggiorna scheda cliente (append a Storico conversazioni), crea eventuali nuovi task. |
ingesta |
Quando c'è materiale grezzo | Processa i file in RAW/: estrae concetti rilevanti, crea/aggiorna pagine wiki, aggiorna index.md. I file in RAW/ non vengono mai eliminati (sorgenti immutabili). |
query [domanda] |
Ricerca nel vault | Legge index.md, identifica pagine rilevanti, sintetizza con citazioni esplicite. Se la sintesi è nuova conoscenza: la salva in Wiki/Analisi/ (file-back Karpathy). |
lint |
Fine settimana | Trova pagine orfane, wikilink rotti, contraddizioni, schede cliente con attività CRM non riflessa nel vault. Non corregge autonomamente — presenta lista e aspetta istruzioni. |
analisi settimana |
Venerdì/weekend | Fatturato settimana vs precedente, visite, task aperti/chiusi, offerte, clienti dormienti. |
analisi mese |
Fine mese | Fatturato mensile per mandante con trend, confronto anno su anno, top prodotti, stato progetti, decisioni del mese. |
nuovo cliente [nome] |
Acquisizione nuovo cliente | Crea Commerciale/Clienti/[nome].md con struttura standard, aggiorna index.md. |
riattiva [nome] |
Cliente dormiente | Analizza storico ordini + ultima visita + mandanti, propone strategia di ricontatto, crea task. |
email cliente [nome] |
Comunicazione cliente | Legge scheda vault + CRM, redige bozza email professionale contestualizzata. |
| ✅ PUOI | Appendere in “Storico conversazioni” con data e contesto |
| ✅ PUOI | Aggiornare “Punti aperti” con nuovi task emersi dalla sessione |
| ❌ MAI | Toccare “Note strategiche” — solo Danilo scrive lì |
| ❌ MAI | Toccare “Conoscenza personale” — solo Danilo scrive lì |
| ❌ MAI | Sovrascrivere contenuto esistente — sempre append |
| ❌ MAI | Copiare dati anagrafici dal CRM (email, telefono, indirizzo) nel vault |
| ❌ MAI | Copiare dati transazionali (fatturato, ordini, sconti) nel vault |
Durante qualsiasi conversazione, senza essere esplicitamente chiesto:
Libreria/decisioni.md con data, contesto e rationaleWiki/Progetti/ + record CRM + taskaggiorna_progetto()| Vault path | ~/SecondBrain/ (Mac locale, non sul VPS) |
| File regole agente | ~/SecondBrain/CLAUDE.md |
| Architettura completa | ~/SecondBrain/Wiki/Concetti/sistema-second-brain-architettura.md |
| Guida routine | ~/SecondBrain/Contesto/guida-utilizzo.md |
| Progetti attivi | ~/SecondBrain/Wiki/Progetti/ |
| MCP tools CRM | Vedere sezione 4 (mcp_crm.py, porta 9094) |
| MCP tools Salute | Vedere sezione 4 (mcp_salute.py, porta 9096) |
Manuale VPS Gemini9 v13 — Aggiornato il 27 Maggio 2026
v12: 15 Aprile 2026 (struttura iniziale) — v13: 27 Maggio 2026 (SSH porta 2222, Progetti Commerciali, Task Commerciali, MCP tools aggiornati)
Danilo Bertone — Gemini9