Redis & BullMQ Setup Guide
β What's Already Doneβ
1. Redis Installed β β
- β
Redis service added to
docker-compose.yml - β
Redis container running on
localhost:6379 - β Redis volume created for persistence
- β Health check configured
- β Connection tested successfully (PONG received)
2. Database Migration Complete β β
- β
All template tables created:
document_template(with all enhanced fields)location_template_configprinter_profiletemplate_variabletemplate_audit(new!)
- β All indexes created
- β Database types generated
3. BullMQ Installed β β
- β
@nestjs/bullandbullmqpackages installed
π Next Steps: Configure BullMQβ
Step 1: Add Redis Configuration to Backendβ
Add these environment variables to your backend .env file:
# Redis Configuration for BullMQ
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=
Step 2: Update PdfModule for BullMQβ
Update /Users/luisrangel/devLR/rpa/flowpos-workspace/apps/backend/src/pdf/pdf.module.ts:
import { BullModule } from '@nestjs/bull';
@Module({
imports: [
BullModule.forRoot({
redis: {
host: process.env.REDIS_HOST || 'localhost',
port: parseInt(process.env.REDIS_PORT || '6379', 10),
password: process.env.REDIS_PASSWORD || undefined,
},
}),
BullModule.registerQueue({
name: 'preview-generation',
defaultJobOptions: {
attempts: 3,
backoff: {
type: 'exponential',
delay: 2000,
},
removeOnComplete: 100,
removeOnFail: 500,
},
}),
],
// ... rest of module config
})
Step 3: Create Preview Generation Processorβ
Create file: apps/backend/src/pdf/infrastructure/queues/preview-generation.processor.ts
import { Process, Processor } from '@nestjs/bull';
import { Job } from 'bull';
import { Injectable, Logger } from '@nestjs/common';
import { TemplateRepository } from '@/pdf/infrastructure/repositories/template.repository';
@Processor('preview-generation')
@Injectable()
export class PreviewGenerationProcessor {
private readonly logger = new Logger(PreviewGenerationProcessor.name);
constructor(
private readonly templateRepository: TemplateRepository,
) {}
@Process('generate-preview')
async handlePreviewGeneration(job: Job<{ templateId: string; documentType: string }>) {
const { templateId, documentType } = job.data;
try {
this.logger.log(`Starting preview generation for template ${templateId}`);
// Update status to processing
await this.templateRepository.update(templateId, {
previewStatus: 'processing',
});
// TODO: Implement actual preview generation
// 1. Get template
// 2. Generate sample data
// 3. Compile template
// 4. Generate PDF
// 5. Take screenshot
// 6. Upload to storage
// 7. Update template with preview URL
// For now, just mark as completed
await this.templateRepository.update(templateId, {
previewStatus: 'completed',
});
this.logger.log(`Preview generated successfully for template ${templateId}`);
} catch (error) {
this.logger.error(`Preview generation failed for template ${templateId}:`, error);
await this.templateRepository.update(templateId, {
previewStatus: 'failed',
});
throw error; // Let BullMQ handle retries
}
}
}
Step 4: Update UploadTemplateUseCase to Use Queueβ
Update the TODO section in upload-template.use-case.ts:
import { InjectQueue } from '@nestjs/bull';
import { Queue } from 'bull';
export class UploadTemplateUseCase {
constructor(
// ... other dependencies
@InjectQueue('preview-generation') private readonly previewQueue: Queue,
) {}
async execute(dto: UploadTemplateDto, userContext: UserContext): Promise<DocumentTemplate> {
// ... existing code ...
// Replace the TODO comment with:
await this.previewQueue.add('generate-preview', {
templateId: template.id,
documentType: template.documentType,
});
// ... rest of code
}
}
Step 5: Register Processor in PdfModuleβ
import { PreviewGenerationProcessor } from '@/pdf/infrastructure/queues/preview-generation.processor';
@Module({
// ... imports above
providers: [
// ... existing providers
PreviewGenerationProcessor,
],
})
π§ͺ Testing Redis & BullMQβ
Test Redis Connectionβ
# Test from command line
docker exec flowpos-workspace-redis-1 redis-cli ping
# Should return: PONG
# Test SET and GET
docker exec flowpos-workspace-redis-1 redis-cli SET test "Hello Redis"
docker exec flowpos-workspace-redis-1 redis-cli GET test
# Should return: "Hello Redis"
Test BullMQ Queue (After Implementation)β
# Upload a template (will trigger queue)
curl -X POST http://localhost:4000/pdf/templates/upload \
-H "Content-Type: application/json" \
-d '{
"name": "Test Template",
"documentType": "sale",
"templateFormat": "standard_a4",
"htmlTemplate": "<!DOCTYPE html><html><body>Test</body></html>",
"userId": "test-user"
}'
# Check template preview status
curl http://localhost:4000/pdf/templates/{templateId}
# Should show: "previewStatus": "processing" or "completed"
π³ Docker Commandsβ
Start Redisβ
docker-compose up -d redis
Stop Redisβ
docker-compose stop redis
View Redis Logsβ
docker-compose logs -f redis
Restart Redisβ
docker-compose restart redis
Redis CLI Accessβ
docker exec -it flowpos-workspace-redis-1 redis-cli
π Redis Monitoringβ
Check Redis Statsβ
docker exec flowpos-workspace-redis-1 redis-cli INFO stats
Monitor Redis Commandsβ
docker exec flowpos-workspace-redis-1 redis-cli MONITOR
Check Memory Usageβ
docker exec flowpos-workspace-redis-1 redis-cli INFO memory
β Current Statusβ
β Completedβ
- Redis container running on port 6379
- Redis persistent storage configured
- Health checks enabled
- Database migration run successfully
- All template tables created
- BullMQ package installed
π Next Stepsβ
- Configure BullMQ in PdfModule
- Create PreviewGenerationProcessor
- Update UploadTemplateUseCase to use queue
- Test preview generation workflow
π Summaryβ
Redis Status: β
Running (healthy)
Port: 6379
Storage: Persistent (redis_data volume)
Migration: β
Complete
Tables: β
All 5 template tables created
You're all set! Redis is running and ready for BullMQ integration! π