L’une des forces cachées de Pocketbase est qu’il n’est pas qu’un binaire pré-compilé : c’est aussi un framework Go que vous pouvez étendre avec votre propre code. Cela ouvre des possibilités énormes : intégration avec un service de paiement Mobile Money, calculs complexes, validation métier, logique transactionnelle, intégration WhatsApp Business, agrégations en temps réel. Voici le guide pour utiliser les hooks Go Pocketbase en 2026.
Voir le guide complet Pocketbase pour les bases.
Pourquoi étendre Pocketbase
- Validation côté serveur impossible via API rules (calculs complexes, dépendance externe)
- Side-effects après un événement : envoi WhatsApp, déclenchement Mobile Money, notification Slack
- Endpoints custom HTTP qui ne correspondent pas à une collection
- Intégration avec services tiers (Wave, Orange Money, OpenAI, etc.)
- Agrégation de données ou requêtes complexes non exprimables en filter Pocketbase
Étape 1 — Setup projet Go
mkdir mon-pb && cd mon-pb
go mod init mon-pb
go get github.com/pocketbase/pocketbase
# Structure
mon-pb/
├── main.go
├── go.mod
├── go.sum
└── pb_data/ (créé au premier run)
Étape 2 — main.go basique
package main
import (
"log"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/core"
)
func main() {
app := pocketbase.New()
// Hook : avant la création d'un nouveau post
app.OnRecordCreateRequest("posts").BindFunc(func(e *core.RecordRequestEvent) error {
title := e.Record.GetString("title")
if len(title) < 5 {
return e.BadRequestError("Titre trop court", nil)
}
return e.Next()
})
// Hook : après création
app.OnRecordAfterCreateSuccess("posts").BindFunc(func(e *core.RecordEvent) error {
log.Printf("Post créé: %s", e.Record.GetString("title"))
// Envoyer notification, indexer dans search, etc.
return e.Next()
})
if err := app.Start(); err != nil {
log.Fatal(err)
}
}
# Build et run
go build -o pocketbase
./pocketbase serve --http=0.0.0.0:8090
Étape 3 — Hooks principaux disponibles
OnBootstrap: au démarrage de PocketbaseOnRecordCreateRequest("collection"),OnRecordUpdateRequest,OnRecordDeleteRequest: avant validation côté APIOnRecordAfterCreateSuccess,OnRecordAfterUpdateSuccess: après écriture en baseOnMailerSend: intercepter envoi d’emailOnRealtimeMessageSend: intercepter messages WebSocket
Étape 4 — Endpoint HTTP custom
app.OnServe().BindFunc(func(e *core.ServeEvent) error {
e.Router.GET("/api/stats/dashboard", func(c *core.RequestEvent) error {
// Compter les posts publiés
var count int
err := app.DB().NewQuery("SELECT COUNT(*) FROM posts WHERE published = 1").Row(&count)
if err != nil {
return c.InternalServerError("erreur", err)
}
return c.JSON(200, map[string]int{"published_posts": count})
})
return e.Next()
})
Étape 5 — Cas concret : Mobile Money
Hook qui crée automatiquement une session de paiement Wave quand une commande est créée :
app.OnRecordAfterCreateSuccess("orders").BindFunc(func(e *core.RecordEvent) error {
amount := e.Record.GetInt("amount")
orderID := e.Record.Id
sessionID, paymentURL, err := createWaveSession(amount, orderID)
if err != nil {
log.Printf("Wave session error: %v", err)
return e.Next()
}
e.Record.Set("waveSessionId", sessionID)
e.Record.Set("paymentUrl", paymentURL)
if err := e.App.Save(e.Record); err != nil {
return err
}
return e.Next()
})
// createWaveSession appelle l'API Wave et retourne sessionID + URL
func createWaveSession(amount int, orderID string) (string, string, error) {
// Cf. notre tutoriel Wave : itskillscenter.io/api-wave-nodejs-integration-2026/
// ...
}
Étape 6 — Migrations versionnées
Pour gérer les changements de schéma de manière reproductible (équipe, environnements multiples), utilisez les migrations Pocketbase :
# Générer une migration depuis l'état actuel
./pocketbase migrate collections
# Créer une migration vide pour modifier
./pocketbase migrate create "add_publish_field"
# Appliquer
./pocketbase migrate up
Étape 7 — Compiler et déployer
# Compiler statiquement pour Linux x86_64
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o pocketbase
# Pousser sur Coolify via Git + Dockerfile
# Voir : itskillscenter.io/pocketbase-deployer-coolify-tutoriel/
Adaptation Afrique de l’Ouest
Pocketbase + hooks Go est particulièrement puissant pour les PME ouest-africaines : un seul backend qui gère auth, données métier, et logique de paiement Wave/Orange Money/Free Money. Coût d’hébergement minimum (4 €/mois Hetzner CX22), maintenance réduite, scaling vertical simple.
Erreurs fréquentes
| Erreur | Cause | Solution |
|---|---|---|
| Build CGO error | SQLite C dépendances | CGO_ENABLED=0 (Pocketbase utilise modernc/sqlite Go pur) |
| Hook ne se déclenche pas | Mauvais nom de collection | Vérifier exact case-sensitive |
| Panic dans hook | Pas de defer recover | Toujours catch errors et returner |
| Migration cassée | Conflit entre dashboard et fichier | Préférer migrate workflow strict |
Pour aller plus loin
- Guide complet Pocketbase
- Déployer Pocketbase Coolify
- Auth Pocketbase OAuth
- Documentation Pocketbase Go : pocketbase.io/docs/go-overview