OCF Worker

OCF Worker est un microservice Go pour la génération asynchrone de cours dans le cadre du projet Open Course Factory (OCF). Il traite des jobs de génération de maniÚre asynchrone avec une API REST et un systÚme de storage abstrait supportant filesystem et Garage S3.
đ FonctionnalitĂ©s
- â
API REST complÚte pour la gestion des jobs de génération
- â
Storage abstrait avec backends filesystem et Garage S3
- â
Upload multipart pour les fichiers sources
- â
Gestion asynchrone des jobs avec statuts et progression
- â
Base PostgreSQL avec GORM et types JSON personnalisés
- â
Docker ready avec docker-compose pour le développement
- â
Tests complets unitaires et d'intégration
- â
Cleanup automatique des jobs anciens
- â
Health checks et monitoring
đïž Architecture
ocf-worker/
âââ cmd/generator/main.go # Point d'entrĂ©e
âââ internal/
â âââ api/ # HTTP handlers et routes
â â âââ handlers.go # Handlers pour jobs
â â âââ storage_handlers.go # Handlers pour storage
â â âââ router.go # Configuration des routes
â âââ config/ # Configuration (env vars)
â âââ database/ # Connexion PostgreSQL + GORM
â âââ jobs/ # Service et repository pour jobs
â âââ storage/ # Storage abstraction
â âââ filesystem/ # Backend filesystem
â âââ garage/ # Backend Garage S3
âââ pkg/
â âââ models/ # Models GORM avec types JSON
â âââ storage/ # Interface storage
âââ deployments/docker/ # Docker + docker-compose
âââ scripts/ # Scripts d'aide et de test
âââ tests/ # Tests d'intĂ©gration
đ API Endpoints
Jobs de génération
| Méthode |
Endpoint |
Description |
POST |
/api/v1/generate |
Créer un nouveau job |
GET |
/api/v1/jobs/{id} |
Statut d'un job |
GET |
/api/v1/jobs |
Liste des jobs (avec filtres) |
Storage des fichiers
| Méthode |
Endpoint |
Description |
POST |
/api/v1/storage/jobs/{job_id}/sources |
Upload fichiers sources |
GET |
/api/v1/storage/jobs/{job_id}/sources |
Liste fichiers sources |
GET |
/api/v1/storage/jobs/{job_id}/sources/{filename} |
Download fichier source |
GET |
/api/v1/storage/courses/{course_id}/results |
Liste résultats |
GET |
/api/v1/storage/courses/{course_id}/results/{filename} |
Download résultat |
GET |
/api/v1/storage/jobs/{job_id}/logs |
Logs d'un job |
Monitoring
| Méthode |
Endpoint |
Description |
GET |
/health |
Health check |
GET |
/api/v1/storage/info |
Information storage |
đ ïž Installation et DĂ©marrage
Prérequis
- Go 1.23+
- Docker & Docker Compose
- PostgreSQL 15 (via Docker)
Démarrage rapide
# 1. Cloner le projet
git clone https://github.com/your-org/ocf-worker.git
cd ocf-worker
# 2. Copier la configuration
cp .env.example .env
# 3. Démarrer avec Docker Compose
docker-compose up -d
# 4. Vérifier que tout fonctionne
curl http://localhost:8081/health
Configuration
Variables d'environnement
# Serveur
PORT=8081
LOG_LEVEL=info
ENVIRONMENT=development
# Base de données
DATABASE_URL=postgres://ocf_worker:password@postgres-worker:5432/ocf_worker_db?sslmode=disable
# Storage (filesystem par défaut)
STORAGE_TYPE=filesystem
STORAGE_PATH=./storage
# Ou storage Garage S3
STORAGE_TYPE=garage
GARAGE_ENDPOINT=https://s3.garage.example.com
GARAGE_ACCESS_KEY=your_access_key
GARAGE_SECRET_KEY=your_secret_key
GARAGE_BUCKET=ocf-courses
GARAGE_REGION=us-east-1
# Jobs
JOB_TIMEOUT=30m
CLEANUP_INTERVAL=1h
đ§Ș Tests
Tests unitaires
# Tous les tests
make test
# Tests spécifiques
go test -v ./internal/api/
go test -v ./internal/storage/filesystem/
go test -v ./internal/storage/garage/
go test -v ./internal/config/
Tests d'intégration
# Test de l'API storage avec filesystem
./test_storage_api.sh
# Test avec Garage S3
./test_storage_api.sh garage
# Test complet avec Garage
./scripts/test-garage-integration.sh
Tests automatisés
# Script complet de test
./test_api.sh
đŠ Storage Backends
Filesystem Storage
Storage local sur le systĂšme de fichiers.
Configuration :
STORAGE_TYPE=filesystem
STORAGE_PATH=./storage
Structure :
storage/
âââ sources/{job_id}/
âââ results/{course_id}/
âââ logs/{job_id}/
Garage S3 Storage
Storage distribué S3-compatible avec Garage.
Configuration :
STORAGE_TYPE=garage
GARAGE_ENDPOINT=https://s3.garage.example.com
GARAGE_ACCESS_KEY=GK31c2f218a2e44f485b94239e
GARAGE_SECRET_KEY=4420d99ef7aa26b56b5130ad7913a6a5c77653a5e7a47a3b4c9b8b9c5f8b7b4d
GARAGE_BUCKET=ocf-courses
GARAGE_REGION=garage
Avantages :
- â
Distribué et répliqué
- â
Compatible AWS S3
- â
URLs présignées
- â
Auto-hébergé
đł Docker
Développement
# Démarrage standard
make docker-dev
# Avec hot reload
make docker-dev-hot
# Logs
make logs
Production
# Copier la configuration
cp .env.example .env.prod
# Configurer les variables
vim .env.prod
# Démarrer en production
make docker-prod
Images Docker
- Base :
golang:1.23 + node:24-bookworm-slim
- Runtime : Utilisateur non-root pour la sécurité
- Health checks : Intégrés
- Volumes : Storage et logs persistants
đ ModĂšles de donnĂ©es
GenerationJob
type GenerationJob struct {
ID uuid.UUID `json:"id"`
CourseID uuid.UUID `json:"course_id"`
Status JobStatus `json:"status"` // pending, processing, completed, failed, timeout
Progress int `json:"progress"` // 0-100
SourcePath string `json:"source_path"`
ResultPath string `json:"result_path"`
CallbackURL string `json:"callback_url"`
Error string `json:"error,omitempty"`
Logs StringSlice `json:"logs"` // JSONB array
Metadata JSON `json:"metadata"` // JSONB object
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
StartedAt *time.Time `json:"started_at,omitempty"`
CompletedAt *time.Time `json:"completed_at,omitempty"`
}
Types JSON personnalisés
JSON : map[string]interface{} avec support PostgreSQL JSONB
StringSlice : []string avec support PostgreSQL JSONB
đ Workflow d'utilisation
sequenceDiagram
participant Client
participant API
participant DB
participant Storage
participant Worker
Client->>API: POST /api/v1/generate
API->>DB: Créer job (status: pending)
API-->>Client: Job créé (job_id)
Client->>API: POST /api/v1/storage/jobs/{id}/sources
API->>Storage: Upload fichiers sources
Storage-->>API: Upload confirmé
Worker->>DB: Récupérer jobs pending
Worker->>Storage: Download sources
Worker->>Worker: Exécuter Slidev build
Worker->>Storage: Upload résultats
Worker->>DB: Mettre Ă jour status (completed)
Client->>API: GET /api/v1/jobs/{id}
API->>DB: Récupérer status
API-->>Client: Status job
Client->>API: GET /api/v1/storage/courses/{id}/results
API->>Storage: Liste résultats
API-->>Client: Liste fichiers
đ§ DĂ©veloppement
Structure du code
cmd/ : Points d'entrée des applications
internal/ : Code interne Ă l'application
pkg/ : Packages réutilisables
deployments/ : Configuration Docker
scripts/ : Scripts d'aide
Ajout d'un nouveau backend storage
- Créer
internal/storage/newbackend/storage.go
- Implémenter l'interface
storage.Storage
- Ajouter le backend dans
factory.go
- Créer les tests dans
storage_test.go
- Mettre Ă jour la configuration
Guidelines
- Tests : Couverture > 80%
- Logs : Structured logging avec niveaux
- Erreurs : Wrapping avec context
- API : REST avec JSON
- Docker : Multi-stage builds
đŠ Ătat du projet
â
Terminé
- API REST complĂšte
- Storage filesystem et Garage
- ModĂšles avec types JSON
- Base PostgreSQL avec GORM
- Docker et docker-compose
- Tests unitaires et d'intégration
- Scripts de test automatisés
- Worker de génération Slidev
- Traitement asynchrone des jobs
- Génération des résultats
- Webhooks de notification
đ Ă venir
- Monitoring avec Prometheus
- Métriques et alertes
- Scaling horizontal
- Cache Redis
- Rate limiting
đ€ Contribution
- Fork le projet
- Créer une branche feature (
git checkout -b feature/amazing-feature)
- Commit les changements (
git commit -m 'Add amazing feature')
- Push vers la branche (
git push origin feature/amazing-feature)
- Ouvrir une Merge Request
RĂšgles de contribution
- Tests obligatoires pour toute nouvelle fonctionnalité
- Documentation mise Ă jour
- Code formaté avec
go fmt
- Linting avec
golangci-lint
đ Licence
Ce projet est sous licence GNU AGPL 3.0. Voir le fichier LICENSE pour plus de détails.
đ Support
đ Remerciements
Made with â€ïž by the OCF Team