| Hostname | VPS Gemini9 |
| IP Pubblico | 185.198.244.81 |
| IP VPN | 10.0.0.1 |
| Dominio CRM | crm.gemini9.it |
| SSH | Porta 22, user claudeuser |
| 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 | 24 totali (15 CRM + 9 Salute) |
| 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) |
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: analisi fatturato, analisi ordine, briefing cliente, cerca ordini, clienti dormienti, confronto condizioni, previsione ordini, promo efficaci, riepilogo visite, strategia commerciale, tattiche chiusura, top prodotti, artiglieria.
| 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 |
Usato per campagne WhatsApp (es. auguri Pasqua, comunicazioni commerciali) e per solleciti RDO. La lista contatti disponibile conta 1867 cellulari unici.
| 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 |
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) |
| Nome File | Contenuto |
|---|---|
openclaw | Dati OpenClaw workspace, memory, config (~22 MB) |
| File totali/giorno | 8 |
| Volume totale | ~140 MB/giorno |
| Retention Drive | 15 file per tipo |
| Retention locale | 14 giorni |
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
| 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 22 non raggiungibile da iPhone via VPN |
| 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)Manuale VPS Gemini9 v12 — Generato il 15 Aprile 2026
Danilo Bertone — Gemini9