High-Performance ETL Platform for Modern Data Engineering
Conductor is a powerful, enterprise-grade ETL (Extract, Transform, Load) platform designed for seamless data orchestration between databases, APIs, and file systems. Built with modern .NET and featuring a beautiful Svelte frontend, it delivers exceptional performance through advanced parallelization and channel-based processing.
- β¨ Features
- ποΈ Architecture
- π Quick Start
- π Installation
- βοΈ Configuration
- π― Usage
- π API Reference
- π Data Flow
- π§ Advanced Configuration
- π Monitoring & Observability
- π Security
- π³ Docker Deployment
- π§ͺ Development
- π€ Contributing
- π License
- High-Performance ETL: Channel-based producer-consumer pattern for maximum throughput
- Multi-Database Support: PostgreSQL, MySQL, SQLite, SQL Server with connection pooling
- RESTful API Integration: Native support for HTTP/HTTPS endpoints with pagination
- Parallel Processing: Configurable parallel execution with intelligent resource management
- Real-time Monitoring: Built-in job tracking, health checks, and performance metrics
- Intuitive Dashboard: Clean, responsive Svelte-based UI with Tailwind CSS
- Job Management: Visual job scheduling, monitoring, and execution control
- Data Preview: Interactive data exploration and validation tools
- Real-time Updates: Live status updates and progress tracking
- LDAP Authentication: Enterprise directory integration
- Data Encryption: AES-256 encryption for sensitive connection strings
- Network Security: IP filtering, CORS configuration, and HTTPS support
- Role-based Access: Fine-grained permission system
- OpenTelemetry: Comprehensive distributed tracing
- Structured Logging: Serilog with configurable log levels
- Health Monitoring: Docker-ready health checks
- Error Notifications: Webhook-based error alerting
- Docker Support: Complete containerization with Docker Compose
- Environment Configuration: Flexible configuration management
- Scalability: Horizontal scaling capabilities
- Cloud Ready: Kubernetes and cloud platform compatible
graph TB
subgraph "Frontend Layer"
UI[Svelte UI]
API_CLIENT[API Client]
end
subgraph "API Layer"
CONTROLLER[Controllers]
MIDDLEWARE[Middleware]
AUTH[Authentication]
end
subgraph "Business Logic"
PIPELINE[Extraction Pipeline]
SCHEDULER[Job Scheduler]
TRANSFORMER[Data Transformer]
end
subgraph "Data Layer"
REPO[Repositories]
POOL[Connection Pool]
MEMORY[Memory Manager]
end
subgraph "External Systems"
DB[(Databases)]
API_EXT[External APIs]
FILES[File Systems]
end
UI --> API_CLIENT
API_CLIENT --> CONTROLLER
CONTROLLER --> MIDDLEWARE
MIDDLEWARE --> AUTH
CONTROLLER --> PIPELINE
CONTROLLER --> SCHEDULER
PIPELINE --> TRANSFORMER
PIPELINE --> REPO
REPO --> POOL
POOL --> DB
PIPELINE --> API_EXT
PIPELINE --> FILES
SCHEDULER --> PIPELINE
MEMORY --> PIPELINE
- π Extraction Pipeline: Core processing engine with parallel execution
- ποΈ Connection Pool Manager: Efficient database connection management
- π§ Memory Manager: Intelligent DataTable lifecycle management
- π Job Tracker: Comprehensive job scheduling and monitoring
- π Data Transformers: Flexible data transformation capabilities
- π HTTP Exchange: RESTful API integration layer
Get Conductor running in under 5 minutes:
# Clone the repository
git clone https://github.com/leonardomb1/Conductor.git
cd Conductor
dotnet publish -c Release linux-x64 (or the platform you're using)
cd build/publish/
./Conductor -fM ../../.envThat's it! Conductor is now running as an API and ready to process your data.
The docker setup is recommend as it has a web interface aswell:
# Clone the repository
git clone https://github.com/leonardomb1/Conductor.git
cd Conductor
docker compose up -d
open http://localhost:3000- .NET SDK 9.0+ - Download here
- Node.js 18+ - Download here
- Docker & Docker Compose - Install Docker
- PostgreSQL (optional - included in Docker setup)
# Clone and configure
git clone https://github.com/leonardomb1/Conductor.git
cd Conductor
# Copy and configure environment
cp .env.example .env
# Edit .env with your settings
# Deploy with Docker Compose
docker compose up -d
# Check health status
docker compose ps# Backend setup
cd src/Backend
dotnet restore
dotnet build
# Frontend setup
cd ../Frontend
npm install
npm run build
# Configure environment
cp .env.example .env
# Edit .env with your database settings
# Run migrations
dotnet run -- --migrate-init-file
# Start the application
dotnet run -- --file# Download latest release
wget https://github.com/leonardomb1/Conductor/releases/latest/download/conductor-linux-x64.tar.gz
# Extract and run
tar -xzf conductor-linux-x64.tar.gz
cd conductor
# Configure environment
cp .env.example .env
# Edit .env with your settings
# Run migrations and start
./Conductor --migrate-init-fileCreate a .env file in the project root, you can use the .env.example as a basis and edit for your use.
Conductor supports multiple database systems:
| Database | Connection String Example |
|---|---|
| PostgreSQL | Server=localhost;Port=5432;Database=mydb;User Id=user;Password=pass; |
| MySQL | Server=localhost;Port=3306;Database=mydb;Uid=user;Pwd=pass; |
| SQLite | Data Source=app.db;Mode=ReadWriteCreate; |
| SQL Server | Server=localhost;Database=mydb;User Id=user;Password=pass; |
{
"originName": "Production Database",
"originDbType": "PostgreSQL",
"originConStr": "Server=prod-db;Port=5432;Database=sales;User Id=reader;Password=***;",
"": "Server=prod-db;Port=5432;Database=sales;User Id=reader;Password=***;",
"originTimeZoneOffSet": 0
}{
"name": "Daily Sales Extract",
"originId": 1,
"destinationId": 2,
"scheduleId": 1,
"overrideQuery": "SELECT * FROM sales WHERE created_date >= '2025-01-01'"
}# Execute transfer (source to destination)
curl -X POST "http://localhost:8080/api/extractions/transfer?scheduleId=1" \
-H "Authorization: Key your-api-key"
# Execute pull (source to CSV)
curl -X POST "http://localhost:8080/api/extractions/pull?scheduleId=1" \
-H "Authorization: Key your-api-key"
# Fetch data preview
curl -X GET "http://localhost:8080/api/extractions/fetch?id=1&page=1" \
-H "Authorization: Key your-api-key"- Navigate to Extractions in the dashboard
- Select your extraction configuration
- Click Execute Transfer or Pull Data
- Monitor progress in the Jobs section
To be done in the future. Recommended to use a scheduler such as Airflow for this.
When Authentication is activated in the environment variable, all routes, barring ssologin and login routes, require authentication through 'Authorization' header prefixed with either: 1. Key, when using API master key; 2. Bearer, JWT token gained by succesfully logging in the login or ssologin routes; or 3. Basic, with a Base64 encoded user and password.
It is recomended to always use Bearer tokens whenever possible.
Authorization: {Basic|Bearer|Key} your_secretGET /api/extractions- List all extractionsPOST /api/extractions- Create new extractionGET /api/extractions/{id}- Get extraction detailsPUT /api/extractions/{id}- Update extractionDELETE /api/extractions/{id}- Delete extractionPOST /api/extractions/transfer- Execute transfer jobPOST /api/extractions/pull- Execute pull jobGET /api/extractions/fetch- Preview data
GET /api/jobs- List all jobsGET /api/jobs/{id}- Get job detailsDELETE /api/jobs/{id}- Cancel job
GET /api/origins- List data sourcesPOST /api/origins- Create data sourceGET /api/destinations- List destinationsPOST /api/destinations- Create destination
GET /api/schedules- List schedulesPOST /api/schedules- Create schedulePUT /api/schedules/{id}- Update schedule
name- Filter by exact namecontains- Filter by partial name matchscheduleId- Filter by schedule IDoriginId- Filter by origin IDtake- Limit results
page- Page number (1-based)pageSize- Results per page
{
"statusCode": 200,
"message": "Success",
"content": [...],
"page": 1,
"success": true
}- Source Query - Execute query against origin database/API
- Data Extraction - Fetch data using parallel processing
- Transformation - Apply any configured transformations
- Destination Load - Insert/update data in destination
- Monitoring - Track progress and handle errors
- Source Query - Execute query against origin
- Data Extraction - Fetch data in batches
- CSV Generation - Convert to CSV format
- File Export - Save to configured output directory
- Producer-Consumer Pattern - Separate data extraction and loading
- Channel-based Communication - High-performance data pipeline
- Configurable Parallelism - Optimize for your infrastructure
- Memory Management - Automatic cleanup and optimization
# Connection pool settings
CONNECTION_POOL_MAX_SIZE=50
CONNECTION_POOL_MIN_SIZE=5
CONNECTION_IDLE_TIMEOUT_MINUTES=30# DataTable memory management
DATATABLE_LIFETIME_MINUTES=30
DATATABLE_CLEANUP_INTERVAL_MINUTES=5
MEMORY_PRESSURE_THRESHOLD_GB=4
GC_CHECK_INTERVAL_MINUTES=1# Parallel processing
MAX_DEGREE_PARALLEL=20
MAX_CONSUMER_FETCH=200
MAX_PRODUCER_LINECOUNT=100000
# Timeouts
QUERY_TIMEOUT_SEC=1800
CONNECTION_TIMEOUT_MIN=15// Example transformation script
public class CustomTransformer : IDataTransformer
{
public async Task<Result<DataTable>> TransformAsync(DataTable input, string script)
{
// Your transformation logic here
return Result.Ok(transformedData);
}
}# Check API health
curl http://localhost:8080/api/health- OpenTelemetry Integration - Distributed tracing
- Prometheus Metrics - Performance monitoring
- Structured Logging - Comprehensive audit trail
- Custom Dashboards - Grafana-compatible metrics
# Configure logging
LOGGING_LEVEL_DEBUG=false
DEVELOPMENT_MODE=false
SEND_WEBHOOK_ON_ERROR=true- Automatic Retries - Configurable retry policies
- Dead Letter Queues - Failed message handling
- Webhook Notifications - Real-time error alerts
- Graceful Degradation - Partial failure handling
- API Key Authentication - Simple key-based access
- LDAP Integration - Enterprise directory services
- Role-based Access Control - Planned for the future
- Encryption at Rest - AES-256 encryption for sensitive data
- Encryption in Transit - TLS/SSL for all communications
- Connection String Encryption - Automatic credential protection
- IP Whitelisting - Network-level access control
# Generate secure encryption key
openssl rand -base64 32
# Configure secure headers
USE_HTTPS=true
VERIFY_CORS=true
VERIFY_TCP=true
# Set up IP filtering
ALLOWED_IP_ADDRESSES="10.0.0.0/8|192.168.0.0/16"# docker-compose.yml
version: '3.8'
services:
conductor-api:
image: conductor-api:latest
environment:
- CONNECTION_STRING=Server=database;Port=5432;Database=ConductorDb;User Id=conductor;Password=password;
depends_on:
- database
ports:
- "8080:8080"
conductor-frontend:
image: conductor-frontend:latest
environment:
- API_HOST=conductor-api:8080
ports:
- "3000:3000"
database:
image: postgres:15
environment:
- POSTGRES_DB=ConductorDb
- POSTGRES_USER=conductor
- POSTGRES_PASSWORD=password
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
postgres_data:# kubernetes-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: conductor-api
spec:
replicas: 3
selector:
matchLabels:
app: conductor-api
template:
metadata:
labels:
app: conductor-api
spec:
containers:
- name: conductor-api
image: conductor-api:latest
ports:
- containerPort: 8080
env:
- name: CONNECTION_STRING
valueFrom:
secretKeyRef:
name: conductor-secrets
key: connection-string- .NET 9.0 SDK
- Node.js 18+
- Docker Desktop
- PostgreSQL (optional)
Conductor/
βββ src/
β βββ Backend/
β β βββ Controller/ # API controllers
β β βββ Service/ # Business logic
β β βββ Repository/ # Data access
β β βββ Model/ # Entity models
β β βββ Middleware/ # Custom middleware
β β βββ Shared/ # Shared utilities
β βββ Frontend/
β βββ src/
β β βββ routes/ # Svelte routes
β β βββ lib/ # Shared components
β β βββ app.html # Main template
β βββ static/ # Static assets
βββ docker/ # Docker configurations
βββ .github/ # GitHub Actions
βββ docs/ # Documentation
We welcome contributions!
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow .NET coding conventions
- Use Conventional Commits for commit messages
- Update documentation for new features
- Use the issue tracker
- Include reproduction steps and environment details
- Label issues appropriately (bug, enhancement, question)
This project is licensed under the MIT License - see the LICENSE file for details.
- Microsoft .NET Team for the excellent .NET platform
- Svelte Team for the amazing frontend framework
- PostgreSQL Community for the robust database
- Docker Team for containerization platform
- All contributors and users of this project
β Star this repository if you find it useful!