mirror of
https://github.com/Dokploy/dokploy.git
synced 2026-10-19 07:01:35 +00:00
2da2b2dd39
This commit introduces a new queue system using p-limit, addressing resource issues and improving job cancellation capabilities. Key changes include: - Removal of Redis dependency, allowing for in-memory queue management. - Implementation of per-server queues with ordered processing based on server concurrency settings. - Addition of helper functions for job management and status retrieval, ensuring backward compatibility with existing API endpoints. - Updates to database schema to support server concurrency settings. The legacy BullMQ code has been retained for compatibility but is no longer in active use.
4.1 KiB
4.1 KiB
Queue System Migration - BullMQ to p-limit
This directory contains the new queue system that replaces BullMQ with p-limit for deployment queues.
Why the Migration?
- Resource Issues: Users experienced freezing during builds due to resource constraints
- Cancellation Problems: BullMQ workers couldn't be properly canceled when Docker processes restart
- Retry Loops: Unwanted automatic retries when processes are killed
New Architecture
Key Features
- Per-Server Queues: Deployments are grouped by server (local "dokploy-server" or remote servers)
- Ordered Processing: Within each server, deployments are processed based on server concurrency settings
- Global User Concurrency: User's
serverConcurrencycontrols total deployments across all servers - Proper Cancellation: Jobs can be canceled using AbortController
- No Redis Dependency: In-memory queues eliminate Redis dependency issues
Files
service-queue.ts- New p-limit based queue implementationqueueSetup.ts- Compatibility layer for existing codedeployments-queue.ts- Legacy compatibility exportsqueue-types.ts- Shared type definitions
Usage Examples
import { addJobWithUserContext, cancelDeploymentJobs, getDeploymentQueueStatus } from './queueSetup';
// Add a deployment job with user context (recommended for API routes)
const result = await addJobWithUserContext({
applicationType: 'application',
applicationId: '123',
type: 'deploy',
titleLog: 'Deploying app',
descriptionLog: 'Starting deployment',
serverId: 'server-456' // Optional - for remote deployments
}, 'user-id-789'); // User ID for concurrency settings
// Cancel jobs for a service
const cancelled = cancelDeploymentJobs('app-123');
// Get queue status
const status = getDeploymentQueueStatus('app-123');
Database-Driven Concurrency
The system now automatically reads concurrency settings from the database:
-
Global User Concurrency: From
users_temp.serverConcurrencyfield- Controls the TOTAL number of deployments that can run simultaneously for a user
- Example: If
serverConcurrency = 1, only 1 deployment across ALL services at a time - Example: If
serverConcurrency = 3, maximum 3 deployments can run simultaneously across all services
-
Server Concurrency: From
server.concurrencyfield- Controls how many deployments can run simultaneously on a specific server
- Only applies when deploying to remote servers (
serverIdis present) - Example: Server A can handle 2 concurrent deployments, Server B can handle 1
Concurrency Hierarchy
User Global Limit (users_temp.serverConcurrency)
├── dokploy-server (local deployments)
│ ├── App A deployment
│ ├── App B deployment
│ └── Compose C deployment
├── remote-server-1 (server.concurrency = 2)
│ ├── App D deployment
│ └── App E deployment
└── remote-server-2 (server.concurrency = 1)
└── App F deployment
Example Scenarios:
- User has
serverConcurrency = 1: Only 1 deployment total across ALL servers - User has
serverConcurrency = 3: Maximum 3 deployments simultaneously across all servers - Local server: All local apps/compose share the "dokploy-server" queue
- Remote server with
concurrency = 2: That server can handle up to 2 concurrent deployments - Queue grouping:
app-123andapp-456on same server share the same queue
Configuration
- Global Concurrency: Set how many services can deploy simultaneously
- Service Concurrency: Each service processes 1 deployment at a time (FIFO)
import { setGlobalConcurrency } from './service-queue';
// Allow 5 services to deploy simultaneously
setGlobalConcurrency(5);
Migration Notes
- The schedules app still uses BullMQ for cron/repeatable jobs (different use case)
- All existing API endpoints work unchanged due to compatibility layer
- No breaking changes to existing functionality
- Improved resource usage and cancellation capabilities