Notifiche Webhook
I webhook ti permettono di ricevere notifiche HTTP POST in tempo reale ogni volta che qualcosa cambia nel tuo workspace Archyl. Crea un webhook, indirizzalo al tuo URL, seleziona gli eventi che ti interessano e Archyl inviera una notifica al tuo endpoint ogni volta che quegli eventi si verificano.
Panoramica
Quando si verifica un evento -- un sistema viene creato, un rilascio viene distribuito, un ADR viene aggiornato -- Archyl invia una richiesta HTTP POST a ogni webhook iscritto a quell'evento. Il tuo endpoint riceve un payload JSON che descrive cosa e successo, chi l'ha fatto e a quale progetto appartiene.
Casi d'uso tipici:
- Notifiche Slack o Teams quando vengono apportate modifiche all'architettura
- Trigger CI/CD quando viene creato un nuovo rilascio
- Audit logging verso un sistema esterno
- Dashboard personalizzate che reagiscono agli eventi dell'architettura
- Pipeline di automazione che si attivano al completamento delle discovery
Eventi Supportati
Elementi di Architettura
| Categoria | Eventi |
|---|---|
| Sistemi | system.created, system.updated, system.deleted |
| Container | container.created, container.updated, container.deleted |
| Componenti | component.created, component.updated, component.deleted |
| Codice | code.created, code.updated, code.deleted |
| Relazioni | relationship.created, relationship.updated, relationship.deleted |
| Overlay | overlay.created, overlay.updated, overlay.deleted |
Gestione dei Progetti
| Categoria | Eventi |
|---|---|
| Progetti | project.created, project.updated, project.deleted |
| Rilasci | release.created, release.updated, release.deployed |
| Richieste | request.created, request.merged, request.closed |
Documentazione
| Categoria | Eventi |
|---|---|
| ADR | adr.created, adr.updated, adr.deleted |
| Documentazione | documentation.created, documentation.updated, documentation.deleted |
| Flussi | flow.created, flow.updated, flow.deleted |
| Contratti API | api_contract.created, api_contract.updated |
Collaborazione e Analisi
| Categoria | Eventi |
|---|---|
| Commenti | comment.created |
| Lavagne | whiteboard.created |
| Canali Eventi | event_channel.created |
| Discovery | discovery.completed |
| Insight | insight.generated |
Creazione di un Webhook
- Vai in Impostazioni Organizzazione e seleziona la scheda Webhook
- Clicca su Nuovo Webhook
- Compila la configurazione:
| Campo | Obbligatorio | Descrizione |
|---|---|---|
| Nome | Si | Un'etichetta descrittiva (es. "Slack -- Modifiche Architettura") |
| URL | Si | L'endpoint HTTPS che ricevera le richieste POST |
| Token Segreto | No | Un segreto condiviso usato per firmare i payload a scopo di verifica |
| Eventi | Si | Seleziona quali eventi attivano questo webhook |
| Progetti | No | Facoltativamente, limita a progetti specifici |
- Clicca su Crea
Il webhook inizia a ricevere eventi immediatamente.
Formato del Payload
Ogni consegna webhook invia un payload JSON con questa struttura:
{
"event": "system.created",
"timestamp": "2026-03-10T14:30:00Z",
"data": {
"entityType": "system",
"entityName": "Payment Service",
"action": "created",
"userName": "vincent",
"projectId": "a1b2c3d4-...",
"projectName": "My Project"
}
}
| Campo | Descrizione |
|---|---|
event |
La stringa del tipo di evento (es. container.updated, release.deployed) |
timestamp |
Timestamp ISO 8601 di quando si e verificato l'evento |
data.entityType |
Il tipo di entita che e cambiata |
data.entityName |
Il nome dell'entita interessata |
data.action |
L'azione che e stata eseguita |
data.userName |
L'utente che ha generato l'evento |
data.projectId |
UUID del progetto in cui si e verificato l'evento |
data.projectName |
Nome leggibile del progetto |
L'header Content-Type e sempre application/json.
Sicurezza
Header della Richiesta
Ogni consegna webhook include questi header:
| Header | Esempio | Descrizione |
|---|---|---|
Content-Type |
application/json |
Sempre JSON |
User-Agent |
Archyl-Webhook/1.0 |
Identifica la richiesta come proveniente da Archyl |
X-Archyl-Event |
system.created |
Il tipo di evento che ha attivato questa consegna |
X-Archyl-Signature |
sha256=a1b2c3... |
Firma HMAC-SHA256 (solo se e impostato un token segreto) |
Verifica della Firma HMAC-SHA256
Se imposti un token segreto al momento della creazione del webhook, Archyl firma ogni payload usando HMAC-SHA256. La firma viene inviata nell'header X-Archyl-Signature con il formato:
sha256=<digest HMAC-SHA256 codificato in esadecimale>
Per verificare una consegna:
- Leggi il corpo grezzo della richiesta (i byte esatti, prima di qualsiasi parsing JSON)
- Leggi l'header
X-Archyl-Signaturee rimuovi il prefissosha256=per ottenere la firma esadecimale - Calcola un hash HMAC-SHA256 del corpo grezzo usando il tuo token segreto come chiave
- Codifica il risultato in esadecimale e confrontalo con la firma ottenuta al passo 2 usando un confronto a tempo costante
- Rifiuta la richiesta se non corrispondono
Esempio in Go:
func verifyArchylWebhook(r *http.Request, secret string) ([]byte, error) {
body, err := io.ReadAll(r.Body)
if err != nil {
return nil, err
}
header := r.Header.Get("X-Archyl-Signature")
if !strings.HasPrefix(header, "sha256=") {
return nil, fmt.Errorf("missing or invalid signature header")
}
signature := strings.TrimPrefix(header, "sha256=")
mac := hmac.New(sha256.New, []byte(secret))
mac.Write(body)
expected := hex.EncodeToString(mac.Sum(nil))
if !hmac.Equal([]byte(expected), []byte(signature)) {
return nil, fmt.Errorf("signature mismatch")
}
return body, nil
}
Esempio in Node.js:
const crypto = require("crypto");
function verifyArchylWebhook(req, secret) {
const header = req.headers["x-archyl-signature"] || "";
if (!header.startsWith("sha256=")) {
throw new Error("Missing or invalid signature header");
}
const signature = header.slice("sha256=".length);
const body = req.rawBody; // use raw body, not parsed JSON
const expected = crypto
.createHmac("sha256", secret)
.update(body)
.digest("hex");
if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))) {
throw new Error("Signature mismatch");
}
return JSON.parse(body);
}
Esempio in Python:
import hmac
import hashlib
def verify_archyl_webhook(body: bytes, header: str, secret: str) -> dict:
if not header.startswith("sha256="):
raise ValueError("Missing or invalid signature header")
signature = header.removeprefix("sha256=")
expected = hmac.new(
secret.encode(), body, hashlib.sha256
).hexdigest()
if not hmac.compare_digest(expected, signature):
raise ValueError("Signature mismatch")
return json.loads(body)
Usa sempre un confronto a tempo costante (hmac.Equal, crypto.timingSafeEqual, hmac.compare_digest) per prevenire attacchi di tipo timing. Verifica sempre rispetto al corpo grezzo della richiesta -- il parsing e la ri-serializzazione del JSON possono modificare la rappresentazione in byte e invalidare la firma.
Storico delle Consegne
Ogni webhook mantiene un registro delle consegne recenti. Per visualizzarlo:
- Vai in Impostazioni Organizzazione > Webhook
- Clicca sul nome del webhook
- Apri la scheda Consegne
Ogni voce di consegna mostra:
| Campo | Descrizione |
|---|---|
| Evento | Il tipo di evento che ha attivato la consegna |
| Codice di Stato | Il codice di risposta HTTP del tuo endpoint |
| Timestamp | Quando la consegna e stata inviata |
| Durata | Quanto tempo ha impiegato la richiesta |
| Payload della Richiesta | Il corpo JSON completo che e stato inviato |
| Corpo della Risposta | La risposta restituita dal tuo endpoint |
Le consegne vengono conservate per 7 giorni. Dopo tale periodo, vengono eliminate automaticamente.
Un badge verde indica una consegna riuscita (risposta 2xx). Il rosso indica un errore (risposta non-2xx o timeout).
Test
Prima di fare affidamento su un webhook in produzione, verifica che funzioni:
- Apri la pagina di dettaglio del webhook
- Clicca su Invia Test
- Archyl invia un payload di test al tuo endpoint con
event: "webhook.test" - Controlla la scheda Consegne per confermare la ricezione e ispezionare la risposta
La consegna di test utilizza lo stesso meccanismo di firma degli eventi reali, cosi puoi validare la tua logica di verifica della firma contemporaneamente.
Politica di Retry
Quando una consegna fallisce (risposta non-2xx o timeout di rete), Archyl riprova automaticamente:
| Tentativo | Ritardo |
|---|---|
| 1o retry | 1 minuto |
| 2o retry | 5 minuti |
| 3o retry | 30 minuti |
Dopo 3 retry falliti, la consegna viene contrassegnata come non riuscita. Puoi riattivare manualmente qualsiasi consegna fallita dalla scheda Consegne cliccando su Riprova.
Se un webhook fallisce costantemente per 24 ore, Archyl lo disabilita e invia una notifica agli amministratori dell'organizzazione. Riabilitalo dalle impostazioni del webhook una volta risolto il problema.
Filtraggio per Progetti
Per impostazione predefinita, un webhook riceve eventi da tutti i progetti dell'organizzazione. Per restringere l'ambito:
- Modifica il webhook
- Sotto Progetti, seleziona uno o piu progetti
- Salva
Solo gli eventi provenienti dai progetti selezionati attiveranno le consegne. Questo e utile quando team diversi gestiscono progetti diversi e necessitano di notifiche solo per il proprio lavoro.
Puoi aggiornare il filtro per progetto in qualsiasi momento senza dover ricreare il webhook.
Buone Pratiche
Rispondi Rapidamente
Il tuo endpoint dovrebbe restituire una risposta 2xx entro 10 secondi. Se hai bisogno di elaborazioni pesanti, accetta il webhook immediatamente e gestisci il lavoro in modo asincrono in un job in background.
Verifica le Firme
Imposta sempre un token segreto e verifica l'header X-Archyl-Signature. Questo garantisce che i payload provengano realmente da Archyl e non siano stati manomessi.
Usa HTTPS
Utilizza sempre un endpoint HTTPS. Archyl non consegnera webhook a URL HTTP non cifrati.
Filtra per Progetto
Se la tua organizzazione ha molti progetti, limita i webhook ai progetti che ti interessano. Questo riduce il rumore ed evita elaborazioni inutili da parte tua.
Gestisci i Duplicati
In rari casi (retry di rete, failover dell'infrastruttura), il tuo endpoint potrebbe ricevere lo stesso evento piu di una volta. Usa i campi timestamp e event per rilevare e deduplicare.
Monitora lo Stato delle Consegne
Controlla periodicamente la scheda Consegne. Un pattern di errori potrebbe indicare problemi con l'endpoint, regole del firewall o credenziali scadute da parte tua.
Prossimi Passi
- Integrazioni Marketplace -- Connetti servizi esterni e visualizza dati in tempo reale sulle tue dashboard
- Gestione dei Rilasci -- Monitora i deployment nella tua architettura
- Insight sull'Architettura -- Rileva automaticamente problemi architetturali