Add project documentation (CLAUDE.md)
Technical documentation for future reference: - App overview and access credentials - Database schema and API endpoints - VPS configuration details - Update workflow instructions Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
236
CLAUDE.md
Normal file
236
CLAUDE.md
Normal file
@@ -0,0 +1,236 @@
|
|||||||
|
# Supabase Scheduler - Documentazione Progetto
|
||||||
|
|
||||||
|
## Panoramica
|
||||||
|
|
||||||
|
**Supabase Scheduler** è una web app per gestire ed eseguire automaticamente query verso database Supabase multipli. Permette di configurare più istanze Supabase, ciascuna con la propria query e frequenza di esecuzione, e le esegue in background 24/7.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Accesso
|
||||||
|
|
||||||
|
### URL Live
|
||||||
|
- **Applicazione**: https://lab.mlhub.it/supabase-scheduler/
|
||||||
|
- **Repository Git**: https://git.mlhub.it/Michele/supabase-scheduler
|
||||||
|
|
||||||
|
### Credenziali Login (fisse, non modificabili)
|
||||||
|
- **Username**: `testlab`
|
||||||
|
- **Password**: `magarifunzione4`
|
||||||
|
|
||||||
|
Le credenziali sono hardcoded nel file `server.js` (righe 12-13).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cosa Fa
|
||||||
|
|
||||||
|
### Funzionalità Principali
|
||||||
|
|
||||||
|
1. **Gestione Multi-Database**
|
||||||
|
- Aggiungere configurazioni per diversi progetti Supabase
|
||||||
|
- Ogni database ha: nome, URL, anon key, query, frequenza
|
||||||
|
- CRUD completo (Create, Read, Update, Delete)
|
||||||
|
|
||||||
|
2. **Scheduler Automatico**
|
||||||
|
- Esegue query automaticamente secondo la frequenza impostata
|
||||||
|
- Gira 24/7 sul server (anche senza utenti connessi)
|
||||||
|
- Controllo ogni minuto per verificare quali query eseguire
|
||||||
|
|
||||||
|
3. **Log Esecuzioni**
|
||||||
|
- Registra ogni esecuzione con timestamp, status, durata
|
||||||
|
- Memorizza errori per debugging
|
||||||
|
- Ultimi 50 log per database visibili da UI
|
||||||
|
|
||||||
|
4. **Esecuzione Manuale**
|
||||||
|
- Pulsante "Esegui Ora" per testare query on-demand
|
||||||
|
|
||||||
|
### Formato Query Supabase
|
||||||
|
|
||||||
|
Il campo "Query" accetta endpoint REST Supabase:
|
||||||
|
|
||||||
|
```
|
||||||
|
# Esempi validi:
|
||||||
|
users?select=* # Tutti gli utenti
|
||||||
|
products?select=id,name&active=eq.true # Prodotti filtrati
|
||||||
|
orders?select=*&limit=10 # Ultimi 10 ordini
|
||||||
|
rpc/my_function # Chiama RPC function
|
||||||
|
rpc/cleanup_old_data # Function di manutenzione
|
||||||
|
```
|
||||||
|
|
||||||
|
La query viene eseguita come GET request verso:
|
||||||
|
`{SUPABASE_URL}/rest/v1/{QUERY}`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Stack Tecnologico
|
||||||
|
|
||||||
|
| Componente | Tecnologia |
|
||||||
|
|------------|------------|
|
||||||
|
| Backend | Node.js + Express |
|
||||||
|
| Database | SQLite (better-sqlite3) |
|
||||||
|
| Scheduler | node-cron |
|
||||||
|
| Frontend | HTML/CSS/JS vanilla |
|
||||||
|
| Container | Docker (node:18-alpine) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Struttura File
|
||||||
|
|
||||||
|
```
|
||||||
|
supabase-scheduler/
|
||||||
|
├── server.js # Backend Express + scheduler + API
|
||||||
|
├── package.json # Dipendenze Node.js
|
||||||
|
├── docker-compose.yml # Configurazione container
|
||||||
|
├── deploy.sh # Script auto-deploy (solo su VPS)
|
||||||
|
├── public/
|
||||||
|
│ └── index.html # Frontend SPA completo
|
||||||
|
├── data/
|
||||||
|
│ ├── .gitkeep # Mantiene directory in Git
|
||||||
|
│ └── scheduler.db # Database SQLite (gitignored, creato a runtime)
|
||||||
|
├── .env.example # Template variabili ambiente
|
||||||
|
├── .gitignore
|
||||||
|
├── .gitattributes
|
||||||
|
├── README.md # Documentazione utente
|
||||||
|
└── CLAUDE.md # Questo file - documentazione tecnica
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Database SQLite
|
||||||
|
|
||||||
|
### Tabella `databases`
|
||||||
|
Configurazioni dei database Supabase.
|
||||||
|
|
||||||
|
| Campo | Tipo | Descrizione |
|
||||||
|
|-------|------|-------------|
|
||||||
|
| id | INTEGER | Primary key |
|
||||||
|
| name | TEXT | Nome identificativo |
|
||||||
|
| supabase_url | TEXT | URL progetto (https://xxx.supabase.co) |
|
||||||
|
| anon_key | TEXT | Chiave anon/public |
|
||||||
|
| query | TEXT | Endpoint REST da chiamare |
|
||||||
|
| frequency_minutes | INTEGER | Intervallo esecuzione (default 5) |
|
||||||
|
| is_active | INTEGER | 0/1 toggle attivazione |
|
||||||
|
| last_run | TEXT | Timestamp ultima esecuzione |
|
||||||
|
| last_status | TEXT | 'success' o 'error' |
|
||||||
|
| last_error | TEXT | Messaggio errore (se presente) |
|
||||||
|
| created_at | TEXT | Timestamp creazione |
|
||||||
|
| updated_at | TEXT | Timestamp ultima modifica |
|
||||||
|
|
||||||
|
### Tabella `execution_logs`
|
||||||
|
Log di tutte le esecuzioni.
|
||||||
|
|
||||||
|
| Campo | Tipo | Descrizione |
|
||||||
|
|-------|------|-------------|
|
||||||
|
| id | INTEGER | Primary key |
|
||||||
|
| database_id | INTEGER | FK a databases.id |
|
||||||
|
| executed_at | TEXT | Timestamp esecuzione |
|
||||||
|
| status | TEXT | 'success' o 'error' |
|
||||||
|
| response | TEXT | Risposta JSON (troncata a 5000 char) |
|
||||||
|
| error | TEXT | Messaggio errore |
|
||||||
|
| duration_ms | INTEGER | Durata in millisecondi |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## API Endpoints
|
||||||
|
|
||||||
|
### Autenticazione
|
||||||
|
- `POST /api/login` - Login con username/password
|
||||||
|
- `POST /api/logout` - Logout (distrugge sessione)
|
||||||
|
- `GET /api/auth/status` - Verifica stato autenticazione
|
||||||
|
|
||||||
|
### Database CRUD (richiede auth)
|
||||||
|
- `GET /api/databases` - Lista tutti i database
|
||||||
|
- `GET /api/databases/:id` - Dettaglio singolo database
|
||||||
|
- `POST /api/databases` - Crea nuovo database
|
||||||
|
- `PUT /api/databases/:id` - Modifica database
|
||||||
|
- `DELETE /api/databases/:id` - Elimina database
|
||||||
|
|
||||||
|
### Esecuzione e Log (richiede auth)
|
||||||
|
- `POST /api/databases/:id/execute` - Esegui query manualmente
|
||||||
|
- `GET /api/databases/:id/logs` - Ultimi 50 log esecuzione
|
||||||
|
|
||||||
|
### Utility
|
||||||
|
- `GET /api/health` - Health check
|
||||||
|
- `GET /api/scheduler/status` - Stato scheduler
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Configurazione VPS
|
||||||
|
|
||||||
|
### Directory
|
||||||
|
```
|
||||||
|
/opt/lab-supabase-scheduler/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Container Docker
|
||||||
|
- **Nome**: `lab-supabase-scheduler-app`
|
||||||
|
- **Immagine**: `node:18-alpine`
|
||||||
|
- **Porta interna**: 3000
|
||||||
|
- **Rete**: `proxy_net`
|
||||||
|
- **Limiti**: 300M RAM, 0.25 CPU
|
||||||
|
|
||||||
|
### Nginx Routing
|
||||||
|
File: `/opt/lab-router/projects/supabase-scheduler.conf`
|
||||||
|
```nginx
|
||||||
|
location /supabase-scheduler/ {
|
||||||
|
proxy_pass http://lab-supabase-scheduler-app:3000/;
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Workflow Aggiornamenti
|
||||||
|
|
||||||
|
### Modifiche al codice
|
||||||
|
```bash
|
||||||
|
# 1. Modifica file localmente
|
||||||
|
# 2. Commit e push
|
||||||
|
cd "D:\Michele\Progetti\Claude\VPS echosystem\lab\supabase-scheduler"
|
||||||
|
git add .
|
||||||
|
git commit -m "Descrizione modifica"
|
||||||
|
git push origin main
|
||||||
|
|
||||||
|
# 3. Deploy su VPS
|
||||||
|
ssh mic@72.62.49.98 "cd /opt/lab-supabase-scheduler && ./deploy.sh"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Comandi utili VPS
|
||||||
|
```bash
|
||||||
|
# Log container
|
||||||
|
ssh mic@72.62.49.98 "docker logs -f lab-supabase-scheduler-app"
|
||||||
|
|
||||||
|
# Restart container
|
||||||
|
ssh mic@72.62.49.98 "cd /opt/lab-supabase-scheduler && docker compose restart"
|
||||||
|
|
||||||
|
# Accesso shell container
|
||||||
|
ssh mic@72.62.49.98 "docker exec -it lab-supabase-scheduler-app sh"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Note Tecniche
|
||||||
|
|
||||||
|
### Session Warning
|
||||||
|
All'avvio appare warning:
|
||||||
|
```
|
||||||
|
Warning: connect.session() MemoryStore is not designed for production
|
||||||
|
```
|
||||||
|
Per un'app lab è accettabile. In production usare Redis o database session store.
|
||||||
|
|
||||||
|
### Scheduler Logic
|
||||||
|
- Il cron gira ogni minuto (`* * * * *`)
|
||||||
|
- Per ogni database attivo, verifica se è passato `frequency_minutes` dall'ultima esecuzione
|
||||||
|
- Se sì, esegue la query e aggiorna `last_run`, `last_status`, `last_error`
|
||||||
|
|
||||||
|
### Sicurezza
|
||||||
|
- Le anon_key Supabase sono salvate in chiaro nel database SQLite
|
||||||
|
- Per uso production, considerare encryption at rest
|
||||||
|
- La sessione usa cookie HTTP-only ma non secure (lab environment)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cronologia Progetto
|
||||||
|
|
||||||
|
- **Creato**: 2026-01-24
|
||||||
|
- **Autore**: Claude Opus 4.5 + Michele
|
||||||
|
- **Scopo**: Gestione automatica query periodiche verso database Supabase multipli
|
||||||
|
- **Richiesta originale**: App con login fisso, dashboard per configurare database Supabase, scheduler che esegue query automaticamente 24/7
|
||||||
Reference in New Issue
Block a user