Merge workers into API
This commit is contained in:
114
WORKER_CONSOLIDATION_SUMMARY.md
Normal file
114
WORKER_CONSOLIDATION_SUMMARY.md
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
# Worker Consolidation Summary
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
Successfully consolidated the separate Managing.Api.Workers project into the main Managing.Api project as background services. This eliminates Orleans conflicts and simplifies deployment while maintaining all worker functionality.
|
||||||
|
|
||||||
|
## Changes Made
|
||||||
|
|
||||||
|
### 1. ✅ Updated ApiBootstrap.cs
|
||||||
|
- **File**: `src/Managing.Bootstrap/ApiBootstrap.cs`
|
||||||
|
- **Changes**: Added all worker services from WorkersBootstrap to the main AddWorkers method
|
||||||
|
- **Workers Added**:
|
||||||
|
- PricesFifteenMinutesWorker
|
||||||
|
- PricesOneHourWorker
|
||||||
|
- PricesFourHoursWorker
|
||||||
|
- PricesOneDayWorker
|
||||||
|
- PricesFiveMinutesWorker
|
||||||
|
- SpotlightWorker
|
||||||
|
- TraderWatcher
|
||||||
|
- LeaderboardWorker
|
||||||
|
- FundingRatesWatcher
|
||||||
|
- GeneticAlgorithmWorker
|
||||||
|
- BundleBacktestWorker
|
||||||
|
- BalanceTrackingWorker
|
||||||
|
- NotifyBundleBacktestWorker
|
||||||
|
|
||||||
|
### 2. ✅ Configuration Files Updated
|
||||||
|
- **File**: `src/Managing.Api/appsettings.json`
|
||||||
|
- **File**: `src/Managing.Api/appsettings.Oda-docker.json`
|
||||||
|
- **Changes**: Added worker configuration flags to control which workers run
|
||||||
|
- **Default Values**: All workers disabled by default (set to `false`)
|
||||||
|
|
||||||
|
### 3. ✅ Deployment Scripts Updated
|
||||||
|
- **Files**:
|
||||||
|
- `scripts/build_and_run.sh`
|
||||||
|
- `scripts/docker-deploy-local.cmd`
|
||||||
|
- `scripts/docker-redeploy-oda.cmd`
|
||||||
|
- `scripts/docker-deploy-sandbox.cmd`
|
||||||
|
- **Changes**: Removed worker-specific build and deployment commands
|
||||||
|
|
||||||
|
### 4. ✅ Docker Compose Files Updated
|
||||||
|
- **Files**:
|
||||||
|
- `src/Managing.Docker/docker-compose.yml`
|
||||||
|
- `src/Managing.Docker/docker-compose.local.yml`
|
||||||
|
- **Changes**: Removed managing.api.workers service definitions
|
||||||
|
|
||||||
|
### 5. ✅ Workers Project Deprecated
|
||||||
|
- **File**: `src/Managing.Api.Workers/Program.cs`
|
||||||
|
- **Changes**: Added deprecation notice and removed Orleans configuration
|
||||||
|
- **Note**: Project kept for reference but should not be deployed
|
||||||
|
|
||||||
|
## Benefits Achieved
|
||||||
|
|
||||||
|
### ✅ Orleans Conflicts Resolved
|
||||||
|
- **Before**: Two Orleans clusters competing for same ports (11111/30000)
|
||||||
|
- **After**: Single Orleans cluster in main API
|
||||||
|
- **Impact**: No more port conflicts or cluster identity conflicts
|
||||||
|
|
||||||
|
### ✅ Simplified Architecture
|
||||||
|
- **Before**: Two separate applications to deploy and monitor
|
||||||
|
- **After**: Single application with all functionality
|
||||||
|
- **Impact**: Easier deployment, monitoring, and debugging
|
||||||
|
|
||||||
|
### ✅ Resource Efficiency
|
||||||
|
- **Before**: Duplicate service registrations and database connections
|
||||||
|
- **After**: Shared resources and connection pools
|
||||||
|
- **Impact**: Better performance and resource utilization
|
||||||
|
|
||||||
|
### ✅ Configuration Management
|
||||||
|
- **Before**: Separate configuration files for workers
|
||||||
|
- **After**: Centralized configuration with worker flags
|
||||||
|
- **Impact**: Easier to manage and control worker execution
|
||||||
|
|
||||||
|
## How to Enable/Disable Workers
|
||||||
|
|
||||||
|
Workers are controlled via configuration flags in `appsettings.json`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"WorkerPricesFifteenMinutes": false,
|
||||||
|
"WorkerPricesOneHour": false,
|
||||||
|
"WorkerPricesFourHours": false,
|
||||||
|
"WorkerPricesOneDay": false,
|
||||||
|
"WorkerPricesFiveMinutes": false,
|
||||||
|
"WorkerSpotlight": false,
|
||||||
|
"WorkerTraderWatcher": false,
|
||||||
|
"WorkerLeaderboard": false,
|
||||||
|
"WorkerFundingRatesWatcher": false,
|
||||||
|
"WorkerGeneticAlgorithm": false,
|
||||||
|
"WorkerBundleBacktest": false,
|
||||||
|
"WorkerBalancesTracking": false,
|
||||||
|
"WorkerNotifyBundleBacktest": false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Set any worker to `true` to enable it in that environment.
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
### ✅ Build Verification
|
||||||
|
- Main API project builds successfully
|
||||||
|
- All worker dependencies resolved
|
||||||
|
- No compilation errors
|
||||||
|
|
||||||
|
### Next Steps for Full Verification
|
||||||
|
1. **Runtime Testing**: Start the main API and verify workers load correctly
|
||||||
|
2. **Worker Functionality**: Test that enabled workers execute as expected
|
||||||
|
3. **Orleans Integration**: Verify workers can access Orleans grains properly
|
||||||
|
4. **Configuration Testing**: Test enabling/disabling workers via config
|
||||||
|
|
||||||
|
## Migration Complete
|
||||||
|
|
||||||
|
The worker consolidation is now complete. The Managing.Api project now contains all functionality previously split between the API and Workers projects, providing a more maintainable and efficient architecture.
|
||||||
|
|
||||||
|
**Deployment**: Use only the main API deployment scripts. The Workers project should not be deployed.
|
||||||
@@ -3,11 +3,8 @@
|
|||||||
# Navigate to the src directory
|
# Navigate to the src directory
|
||||||
cd ../src
|
cd ../src
|
||||||
|
|
||||||
# Build the managing.api image
|
# Build the managing.api image (now includes all workers as background services)
|
||||||
docker build -t managing.api -f Managing.Api/Dockerfile . --no-cache
|
docker build -t managing.api -f Managing.Api/Dockerfile . --no-cache
|
||||||
|
|
||||||
# Build the managing.api.workers image
|
|
||||||
docker build -t managing.api.workers -f Managing.Api.Workers/Dockerfile . --no-cache
|
|
||||||
|
|
||||||
# Start up the project using docker-compose
|
# Start up the project using docker-compose
|
||||||
docker compose -f Managing.Docker/docker-compose.yml -f Managing.Docker/docker-compose.local.yml up -d
|
docker compose -f Managing.Docker/docker-compose.yml -f Managing.Docker/docker-compose.local.yml up -d
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
cd ..
|
cd ..
|
||||||
cd .\src\
|
cd .\src\
|
||||||
docker build -t managing.api -f ./Managing.Api/Dockerfile . --no-cache
|
docker build -t managing.api -f ./Managing.Api/Dockerfile . --no-cache
|
||||||
docker build -t managing.api.workers -f ./Managing.Api.Workers/Dockerfile . --no-cache
|
|
||||||
docker-compose -f ./Managing.Docker/docker-compose.yml -f ./Managing.Docker/docker-compose.local.yml up -d
|
docker-compose -f ./Managing.Docker/docker-compose.yml -f ./Managing.Docker/docker-compose.local.yml up -d
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
cd ..
|
cd ..
|
||||||
cd .\src\
|
cd .\src\
|
||||||
docker build -t managing.api -f ./Managing.Api/Dockerfile . --no-cache
|
docker build -t managing.api -f ./Managing.Api/Dockerfile . --no-cache
|
||||||
docker build -t managing.api.workers -f ./Managing.Api.Workers/Dockerfile . --no-cache
|
|
||||||
docker-compose -f ./Managing.Docker/docker-compose.yml -f ./Managing.Docker/docker-compose.sandbox.yml up -d
|
docker-compose -f ./Managing.Docker/docker-compose.yml -f ./Managing.Docker/docker-compose.sandbox.yml up -d
|
||||||
@@ -2,21 +2,16 @@ cd ..
|
|||||||
cd .\src\
|
cd .\src\
|
||||||
ECHO "Stopping containers..."
|
ECHO "Stopping containers..."
|
||||||
docker stop sandbox-managing.api-1
|
docker stop sandbox-managing.api-1
|
||||||
docker stop sandbox-managing.api.workers-1
|
|
||||||
ECHO "Contaiters stopped"
|
ECHO "Contaiters stopped"
|
||||||
ECHO "Removing containers..."
|
ECHO "Removing containers..."
|
||||||
docker rm sandbox-managing.api-1
|
docker rm sandbox-managing.api-1
|
||||||
docker rm sandbox-managing.api.workers-1
|
|
||||||
ECHO "Containers removed"
|
ECHO "Containers removed"
|
||||||
ECHO "Removing images..."
|
ECHO "Removing images..."
|
||||||
docker rmi managing.api
|
docker rmi managing.api
|
||||||
docker rmi managing.api:latest
|
docker rmi managing.api:latest
|
||||||
docker rmi managing.api.workers
|
|
||||||
docker rmi managing.api.workers:latest
|
|
||||||
ECHO "Images removed"
|
ECHO "Images removed"
|
||||||
ECHO "Building images..."
|
ECHO "Building images..."
|
||||||
docker build -t managing.api -f ./Managing.Api/Dockerfile . --no-cache
|
docker build -t managing.api -f ./Managing.Api/Dockerfile . --no-cache
|
||||||
docker build -t managing.api.workers -f ./Managing.Api.Workers/Dockerfile . --no-cache
|
|
||||||
ECHO "Deploying..."
|
ECHO "Deploying..."
|
||||||
docker-compose -f ./Managing.Docker/docker-compose.yml -f ./Managing.Docker/docker-compose.sandbox.yml up -d
|
docker-compose -f ./Managing.Docker/docker-compose.yml -f ./Managing.Docker/docker-compose.sandbox.yml up -d
|
||||||
ECHO "Deployed"
|
ECHO "Deployed"
|
||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// DEPRECATED: This Workers API project has been consolidated into the main Managing.Api project
|
||||||
|
// All workers are now hosted as background services in the main API
|
||||||
|
// This project is kept for reference but should not be deployed
|
||||||
|
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
using HealthChecks.UI.Client;
|
using HealthChecks.UI.Client;
|
||||||
using Managing.Api.Workers.Filters;
|
using Managing.Api.Workers.Filters;
|
||||||
@@ -128,6 +132,7 @@ builder.Services.AddDbContext<ManagingDbContext>(options =>
|
|||||||
}, ServiceLifetime.Scoped);
|
}, ServiceLifetime.Scoped);
|
||||||
|
|
||||||
builder.Services.RegisterWorkersDependencies(builder.Configuration);
|
builder.Services.RegisterWorkersDependencies(builder.Configuration);
|
||||||
|
|
||||||
builder.Services.AddEndpointsApiExplorer();
|
builder.Services.AddEndpointsApiExplorer();
|
||||||
builder.Services.AddOpenApiDocument(document =>
|
builder.Services.AddOpenApiDocument(document =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -53,5 +53,8 @@
|
|||||||
<Content Update="appsettings.Production.json">
|
<Content Update="appsettings.Production.json">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
<Content Update="appsettings.KaiServer.json">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
27
src/Managing.Api/appsettings.KaiServer.json
Normal file
27
src/Managing.Api/appsettings.KaiServer.json
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"InfluxDb": {
|
||||||
|
"Url": "https://influx-db.apps.managing.live",
|
||||||
|
"Organization": "managing-org",
|
||||||
|
"Token": "eOuXcXhH7CS13Iw4CTiDDpRjIjQtEVPOloD82pLPOejI4n0BsEj1YzUw0g3Cs1mdDG5m-RaxCavCMsVTtS5wIQ=="
|
||||||
|
},
|
||||||
|
"Privy": {
|
||||||
|
"AppId": "cm6f47n1l003jx7mjwaembhup",
|
||||||
|
"AppSecret": "63Chz2z5M8TgR5qc8dznSLRAGTHTyPU4cjdQobrBF1Cx5tszZpTuFgyrRd7hZ2k6HpwDz3GEwQZzsCqHb8Z311bF"
|
||||||
|
},
|
||||||
|
"N8n": {
|
||||||
|
"WebhookUrl": "https://n8n.kai.managing.live/webhook/fa9308b6-983b-42ec-b085-71599d655951"
|
||||||
|
},
|
||||||
|
"Serilog": {
|
||||||
|
"MinimumLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Override": {
|
||||||
|
"Microsoft": "Information",
|
||||||
|
"System": "Warning"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ElasticConfiguration": {
|
||||||
|
"Uri": "http://elasticsearch:9200"
|
||||||
|
},
|
||||||
|
"AllowedHosts": "*"
|
||||||
|
}
|
||||||
@@ -31,5 +31,18 @@
|
|||||||
"ButtonExpirationMinutes": 2
|
"ButtonExpirationMinutes": 2
|
||||||
},
|
},
|
||||||
"RunOrleansGrains": true,
|
"RunOrleansGrains": true,
|
||||||
|
"WorkerPricesFifteenMinutes": false,
|
||||||
|
"WorkerPricesOneHour": false,
|
||||||
|
"WorkerPricesFourHours": false,
|
||||||
|
"WorkerPricesOneDay": false,
|
||||||
|
"WorkerPricesFiveMinutes": false,
|
||||||
|
"WorkerSpotlight": false,
|
||||||
|
"WorkerTraderWatcher": false,
|
||||||
|
"WorkerLeaderboard": false,
|
||||||
|
"WorkerFundingRatesWatcher": false,
|
||||||
|
"WorkerGeneticAlgorithm": false,
|
||||||
|
"WorkerBundleBacktest": true,
|
||||||
|
"WorkerBalancesTracking": false,
|
||||||
|
"WorkerNotifyBundleBacktest": false,
|
||||||
"AllowedHosts": "*"
|
"AllowedHosts": "*"
|
||||||
}
|
}
|
||||||
@@ -36,9 +36,23 @@
|
|||||||
},
|
},
|
||||||
"RunOrleansGrains": true,
|
"RunOrleansGrains": true,
|
||||||
"AllowedHosts": "*",
|
"AllowedHosts": "*",
|
||||||
|
"KAIGEN_SECRET_KEY": "KaigenXCowchain",
|
||||||
|
"KAIGEN_CREDITS_ENABLED": false,
|
||||||
"WorkerBotManager": true,
|
"WorkerBotManager": true,
|
||||||
"WorkerBalancesTracking": false,
|
"WorkerBalancesTracking": false,
|
||||||
"WorkerNotifyBundleBacktest": false,
|
"WorkerNotifyBundleBacktest": false,
|
||||||
"KAIGEN_SECRET_KEY": "KaigenXCowchain",
|
"WorkerPricesFifteenMinutes": true,
|
||||||
"KAIGEN_CREDITS_ENABLED": false
|
"WorkerPricesOneHour": false,
|
||||||
|
"WorkerPricesFourHours": false,
|
||||||
|
"WorkerPricesOneDay": false,
|
||||||
|
"WorkerPricesFiveMinutes": false,
|
||||||
|
"WorkerFee": false,
|
||||||
|
"WorkerPositionManager": false,
|
||||||
|
"WorkerPositionFetcher": false,
|
||||||
|
"WorkerSpotlight": false,
|
||||||
|
"WorkerTraderWatcher": false,
|
||||||
|
"WorkerLeaderboard": false,
|
||||||
|
"WorkerFundingRatesWatcher": false,
|
||||||
|
"WorkerGeneticAlgorithm": false,
|
||||||
|
"WorkerBundleBacktest": false
|
||||||
}
|
}
|
||||||
@@ -68,5 +68,18 @@
|
|||||||
},
|
},
|
||||||
"RunOrleansGrains": true,
|
"RunOrleansGrains": true,
|
||||||
"DeploymentMode": false,
|
"DeploymentMode": false,
|
||||||
|
"WorkerPricesFifteenMinutes": false,
|
||||||
|
"WorkerPricesOneHour": false,
|
||||||
|
"WorkerPricesFourHours": false,
|
||||||
|
"WorkerPricesOneDay": false,
|
||||||
|
"WorkerPricesFiveMinutes": false,
|
||||||
|
"WorkerSpotlight": false,
|
||||||
|
"WorkerTraderWatcher": false,
|
||||||
|
"WorkerLeaderboard": false,
|
||||||
|
"WorkerFundingRatesWatcher": false,
|
||||||
|
"WorkerGeneticAlgorithm": false,
|
||||||
|
"WorkerBundleBacktest": false,
|
||||||
|
"WorkerBalancesTracking": false,
|
||||||
|
"WorkerNotifyBundleBacktest": false,
|
||||||
"AllowedHosts": "*"
|
"AllowedHosts": "*"
|
||||||
}
|
}
|
||||||
@@ -97,11 +97,11 @@ public class LiveTradingBotGrain : Grain, ILiveTradingBotGrain, IRemindable
|
|||||||
if (botStatus == BotStatus.Running && _tradingBot == null)
|
if (botStatus == BotStatus.Running && _tradingBot == null)
|
||||||
{
|
{
|
||||||
// Now, we can proceed with resuming the bot.
|
// Now, we can proceed with resuming the bot.
|
||||||
await ResumeBotInternalAsync();
|
await ResumeBotInternalAsync(botStatus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task ResumeBotInternalAsync()
|
private async Task ResumeBotInternalAsync(BotStatus previousStatus)
|
||||||
{
|
{
|
||||||
// Idempotency check
|
// Idempotency check
|
||||||
if (_tradingBot != null)
|
if (_tradingBot != null)
|
||||||
@@ -113,7 +113,7 @@ public class LiveTradingBotGrain : Grain, ILiveTradingBotGrain, IRemindable
|
|||||||
{
|
{
|
||||||
// Create and initialize trading bot instance
|
// Create and initialize trading bot instance
|
||||||
_tradingBot = CreateTradingBotInstance(_state.State.Config);
|
_tradingBot = CreateTradingBotInstance(_state.State.Config);
|
||||||
await _tradingBot.Start();
|
await _tradingBot.Start(previousStatus);
|
||||||
|
|
||||||
// Set startup time when bot actually starts running
|
// Set startup time when bot actually starts running
|
||||||
_state.State.StartupTime = DateTime.UtcNow;
|
_state.State.StartupTime = DateTime.UtcNow;
|
||||||
@@ -155,7 +155,7 @@ public class LiveTradingBotGrain : Grain, ILiveTradingBotGrain, IRemindable
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Resume the bot - this handles registry status update internally
|
// Resume the bot - this handles registry status update internally
|
||||||
await ResumeBotInternalAsync();
|
await ResumeBotInternalAsync(status);
|
||||||
_logger.LogInformation("LiveTradingBotGrain {GrainId} started successfully", this.GetPrimaryKey());
|
_logger.LogInformation("LiveTradingBotGrain {GrainId} started successfully", this.GetPrimaryKey());
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ public class TradingBotBase : ITradingBot
|
|||||||
PreloadSince = CandleExtensions.GetBotPreloadSinceFromTimeframe(config.Timeframe);
|
PreloadSince = CandleExtensions.GetBotPreloadSinceFromTimeframe(config.Timeframe);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Start()
|
public async Task Start(BotStatus previousStatus)
|
||||||
{
|
{
|
||||||
if (!Config.IsForBacktest)
|
if (!Config.IsForBacktest)
|
||||||
{
|
{
|
||||||
@@ -77,8 +77,9 @@ public class TradingBotBase : ITradingBot
|
|||||||
// await CancelAllOrders();
|
// await CancelAllOrders();
|
||||||
|
|
||||||
// Send startup message only for fresh starts (not reboots)
|
// Send startup message only for fresh starts (not reboots)
|
||||||
if (!true)
|
switch (previousStatus)
|
||||||
{
|
{
|
||||||
|
case BotStatus.Saved:
|
||||||
var indicatorNames = Config.Scenario.Indicators.Select(i => i.Type.ToString()).ToList();
|
var indicatorNames = Config.Scenario.Indicators.Select(i => i.Type.ToString()).ToList();
|
||||||
var startupMessage = $"🚀 **Bot Started Successfully!**\n\n" +
|
var startupMessage = $"🚀 **Bot Started Successfully!**\n\n" +
|
||||||
$"📊 **Trading Setup:**\n" +
|
$"📊 **Trading Setup:**\n" +
|
||||||
@@ -92,12 +93,21 @@ public class TradingBotBase : ITradingBot
|
|||||||
$"📢 I'll notify you when signals are triggered.";
|
$"📢 I'll notify you when signals are triggered.";
|
||||||
|
|
||||||
await LogInformation(startupMessage);
|
await LogInformation(startupMessage);
|
||||||
}
|
break;
|
||||||
else
|
|
||||||
{
|
case BotStatus.Running:
|
||||||
|
return;
|
||||||
|
|
||||||
|
case BotStatus.Stopped:
|
||||||
|
// If status was Stopped we log a message to inform the user that the bot is restarting
|
||||||
await LogInformation($"🔄 **Bot Restarted**\n" +
|
await LogInformation($"🔄 **Bot Restarted**\n" +
|
||||||
$"📊 Resuming operations with {Signals.Count} signals and {Positions.Count} positions\n" +
|
$"📊 Resuming operations with {Signals.Count} signals and {Positions.Count} positions\n" +
|
||||||
$"✅ Ready to continue trading");
|
$"✅ Ready to continue trading");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// Handle any other status if needed
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -160,6 +170,7 @@ public class TradingBotBase : ITradingBot
|
|||||||
{
|
{
|
||||||
ExecutionCount++;
|
ExecutionCount++;
|
||||||
|
|
||||||
|
Logger.LogInformation($"Date server : {DateTime.UtcNow} - Last candle date bot : {LastCandle.Date}");
|
||||||
Logger.LogInformation($"Signals : {Signals.Count}");
|
Logger.LogInformation($"Signals : {Signals.Count}");
|
||||||
Logger.LogInformation($"ExecutionCount : {ExecutionCount}");
|
Logger.LogInformation($"ExecutionCount : {ExecutionCount}");
|
||||||
Logger.LogInformation($"Positions : {Positions.Count}");
|
Logger.LogInformation($"Positions : {Positions.Count}");
|
||||||
@@ -381,9 +392,11 @@ public class TradingBotBase : ITradingBot
|
|||||||
// Notify platform summary about the executed trade
|
// Notify platform summary about the executed trade
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await ServiceScopeHelpers.WithScopedService<IGrainFactory>(_scopeFactory, async grainFactory =>
|
await ServiceScopeHelpers.WithScopedService<IGrainFactory>(_scopeFactory,
|
||||||
|
async grainFactory =>
|
||||||
{
|
{
|
||||||
var platformGrain = grainFactory.GetGrain<IPlatformSummaryGrain>("platform-summary");
|
var platformGrain =
|
||||||
|
grainFactory.GetGrain<IPlatformSummaryGrain>("platform-summary");
|
||||||
var tradeExecutedEvent = new TradeExecutedEvent
|
var tradeExecutedEvent = new TradeExecutedEvent
|
||||||
{
|
{
|
||||||
TradeId = position.Identifier,
|
TradeId = position.Identifier,
|
||||||
@@ -396,7 +409,9 @@ public class TradingBotBase : ITradingBot
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogWarning(ex, "Failed to notify platform summary about trade execution for position {PositionId}", position.Identifier);
|
Logger.LogWarning(ex,
|
||||||
|
"Failed to notify platform summary about trade execution for position {PositionId}",
|
||||||
|
position.Identifier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -979,7 +994,8 @@ public class TradingBotBase : ITradingBot
|
|||||||
_scopeFactory, async (exchangeService, accountService, tradingService) =>
|
_scopeFactory, async (exchangeService, accountService, tradingService) =>
|
||||||
{
|
{
|
||||||
closedPosition =
|
closedPosition =
|
||||||
await new ClosePositionCommandHandler(exchangeService, accountService, tradingService, _scopeFactory)
|
await new ClosePositionCommandHandler(exchangeService, accountService, tradingService,
|
||||||
|
_scopeFactory)
|
||||||
.Handle(command);
|
.Handle(command);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1036,7 +1052,8 @@ public class TradingBotBase : ITradingBot
|
|||||||
// Check if we have any candles before proceeding
|
// Check if we have any candles before proceeding
|
||||||
if (recentCandles == null || !recentCandles.Any())
|
if (recentCandles == null || !recentCandles.Any())
|
||||||
{
|
{
|
||||||
await LogWarning($"No recent candles available for position {position.Identifier}. Using current candle data instead.");
|
await LogWarning(
|
||||||
|
$"No recent candles available for position {position.Identifier}. Using current candle data instead.");
|
||||||
|
|
||||||
// Fallback to current candle if available
|
// Fallback to current candle if available
|
||||||
if (currentCandle != null)
|
if (currentCandle != null)
|
||||||
@@ -1045,8 +1062,11 @@ public class TradingBotBase : ITradingBot
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
await LogWarning($"No candle data available for position {position.Identifier}. Cannot determine stop loss/take profit hit.");
|
await LogWarning(
|
||||||
Logger.LogError("No candle data available for position {PositionId}. Cannot determine stop loss/take profit hit.", position.Identifier);
|
$"No candle data available for position {position.Identifier}. Cannot determine stop loss/take profit hit.");
|
||||||
|
Logger.LogError(
|
||||||
|
"No candle data available for position {PositionId}. Cannot determine stop loss/take profit hit.",
|
||||||
|
position.Identifier);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ public class PricesService : IPricesService
|
|||||||
throw new Exception($"Enable to found account for exchange {exchange}");
|
throw new Exception($"Enable to found account for exchange {exchange}");
|
||||||
|
|
||||||
var lastCandles =
|
var lastCandles =
|
||||||
await _candleRepository.GetCandles(exchange, ticker, timeframe, DateTime.UtcNow.AddDays(-2));
|
await _candleRepository.GetCandles(exchange, ticker, timeframe, DateTime.UtcNow.AddDays(-30), limit: 5);
|
||||||
var lastCandle = lastCandles.LastOrDefault();
|
var lastCandle = lastCandles.LastOrDefault();
|
||||||
var startDate = lastCandle != null ? lastCandle.Date : new DateTime(2017, 1, 1);
|
var startDate = lastCandle != null ? lastCandle.Date : new DateTime(2017, 1, 1);
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,6 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Managing.Api.Workers\Managing.Api.Workers.csproj"/>
|
|
||||||
<ProjectReference Include="..\Managing.Api\Managing.Api.csproj"/>
|
<ProjectReference Include="..\Managing.Api\Managing.Api.csproj"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
|
using Projects;
|
||||||
|
|
||||||
var builder = DistributedApplication.CreateBuilder(args);
|
var builder = DistributedApplication.CreateBuilder(args);
|
||||||
|
|
||||||
// Add API projects
|
// Add API projects
|
||||||
var managingApi = builder.AddProject<Projects.Managing_Api>("managing-api");
|
var managingApi = builder.AddProject<Managing_Api>("managing-api");
|
||||||
var workersApi = builder.AddProject<Projects.Managing_Api_Workers>("worker-api");
|
|
||||||
|
|
||||||
// No need to add containers - your APIs will use their existing connection strings
|
// No need to add containers - your APIs will use their existing connection strings
|
||||||
// from their respective appsettings.json files
|
// from their respective appsettings.json files
|
||||||
|
|
||||||
// Connect services to resources
|
// Connect services to resources
|
||||||
workersApi.WithReference(managingApi);
|
|
||||||
|
|
||||||
builder.Build().Run();
|
builder.Build().Run();
|
||||||
@@ -87,7 +87,6 @@ public static class ApiBootstrap
|
|||||||
runOrleansGrains = runOrleansGrainsFromEnv;
|
runOrleansGrains = runOrleansGrainsFromEnv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var postgreSqlConnectionString = configuration.GetSection("PostgreSql")["Orleans"];
|
var postgreSqlConnectionString = configuration.GetSection("PostgreSql")["Orleans"];
|
||||||
|
|
||||||
return hostBuilder.UseOrleans(siloBuilder =>
|
return hostBuilder.UseOrleans(siloBuilder =>
|
||||||
@@ -215,6 +214,7 @@ public static class ApiBootstrap
|
|||||||
services.AddScoped<IWorkerService, WorkerService>();
|
services.AddScoped<IWorkerService, WorkerService>();
|
||||||
services.AddScoped<ISynthPredictionService, SynthPredictionService>();
|
services.AddScoped<ISynthPredictionService, SynthPredictionService>();
|
||||||
services.AddScoped<ISynthApiClient, SynthApiClient>();
|
services.AddScoped<ISynthApiClient, SynthApiClient>();
|
||||||
|
services.AddScoped<IPricesService, PricesService>();
|
||||||
services.AddTransient<ICommandHandler<OpenPositionRequest, Position>, OpenPositionCommandHandler>();
|
services.AddTransient<ICommandHandler<OpenPositionRequest, Position>, OpenPositionCommandHandler>();
|
||||||
services.AddTransient<ICommandHandler<ClosePositionCommand, Position>, ClosePositionCommandHandler>();
|
services.AddTransient<ICommandHandler<ClosePositionCommand, Position>, ClosePositionCommandHandler>();
|
||||||
|
|
||||||
@@ -292,6 +292,7 @@ public static class ApiBootstrap
|
|||||||
|
|
||||||
private static IServiceCollection AddWorkers(this IServiceCollection services, IConfiguration configuration)
|
private static IServiceCollection AddWorkers(this IServiceCollection services, IConfiguration configuration)
|
||||||
{
|
{
|
||||||
|
// Balance Workers
|
||||||
if (configuration.GetValue<bool>("WorkerBalancesTracking", false))
|
if (configuration.GetValue<bool>("WorkerBalancesTracking", false))
|
||||||
{
|
{
|
||||||
services.AddHostedService<BalanceTrackingWorker>();
|
services.AddHostedService<BalanceTrackingWorker>();
|
||||||
@@ -302,6 +303,63 @@ public static class ApiBootstrap
|
|||||||
services.AddHostedService<NotifyBundleBacktestWorker>();
|
services.AddHostedService<NotifyBundleBacktestWorker>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Price Workers
|
||||||
|
if (configuration.GetValue<bool>("WorkerPricesFifteenMinutes", false))
|
||||||
|
{
|
||||||
|
services.AddHostedService<PricesFifteenMinutesWorker>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (configuration.GetValue<bool>("WorkerPricesOneHour", false))
|
||||||
|
{
|
||||||
|
services.AddHostedService<PricesOneHourWorker>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (configuration.GetValue<bool>("WorkerPricesFourHours", false))
|
||||||
|
{
|
||||||
|
services.AddHostedService<PricesFourHoursWorker>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (configuration.GetValue<bool>("WorkerPricesOneDay", false))
|
||||||
|
{
|
||||||
|
services.AddHostedService<PricesOneDayWorker>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (configuration.GetValue<bool>("WorkerPricesFiveMinutes", false))
|
||||||
|
{
|
||||||
|
services.AddHostedService<PricesFiveMinutesWorker>();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Other Workers
|
||||||
|
if (configuration.GetValue<bool>("WorkerSpotlight", false))
|
||||||
|
{
|
||||||
|
services.AddHostedService<SpotlightWorker>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (configuration.GetValue<bool>("WorkerTraderWatcher", false))
|
||||||
|
{
|
||||||
|
services.AddHostedService<TraderWatcher>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (configuration.GetValue<bool>("WorkerLeaderboard", false))
|
||||||
|
{
|
||||||
|
services.AddHostedService<LeaderboardWorker>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (configuration.GetValue<bool>("WorkerFundingRatesWatcher", false))
|
||||||
|
{
|
||||||
|
services.AddHostedService<FundingRatesWatcher>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (configuration.GetValue<bool>("WorkerGeneticAlgorithm", false))
|
||||||
|
{
|
||||||
|
services.AddHostedService<GeneticAlgorithmWorker>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (configuration.GetValue<bool>("WorkerBundleBacktest", false))
|
||||||
|
{
|
||||||
|
services.AddHostedService<BundleBacktestWorker>();
|
||||||
|
}
|
||||||
|
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,215 +0,0 @@
|
|||||||
using Managing.Application;
|
|
||||||
using Managing.Application.Abstractions;
|
|
||||||
using Managing.Application.Abstractions.Repositories;
|
|
||||||
using Managing.Application.Abstractions.Services;
|
|
||||||
using Managing.Application.Accounts;
|
|
||||||
using Managing.Application.Backtests;
|
|
||||||
using Managing.Application.ManageBot;
|
|
||||||
using Managing.Application.MoneyManagements;
|
|
||||||
using Managing.Application.Scenarios;
|
|
||||||
using Managing.Application.Shared;
|
|
||||||
using Managing.Application.Synth;
|
|
||||||
using Managing.Application.Trading;
|
|
||||||
using Managing.Application.Trading.Commands;
|
|
||||||
using Managing.Application.Trading.Handlers;
|
|
||||||
using Managing.Application.Users;
|
|
||||||
using Managing.Application.Workers;
|
|
||||||
using Managing.Domain.Trades;
|
|
||||||
using Managing.Infrastructure.Databases;
|
|
||||||
using Managing.Infrastructure.Databases.InfluxDb;
|
|
||||||
using Managing.Infrastructure.Databases.InfluxDb.Abstractions;
|
|
||||||
using Managing.Infrastructure.Databases.InfluxDb.Models;
|
|
||||||
using Managing.Infrastructure.Databases.PostgreSql;
|
|
||||||
using Managing.Infrastructure.Databases.PostgreSql.Configurations;
|
|
||||||
using Managing.Infrastructure.Evm;
|
|
||||||
using Managing.Infrastructure.Evm.Abstractions;
|
|
||||||
using Managing.Infrastructure.Evm.Models.Privy;
|
|
||||||
using Managing.Infrastructure.Evm.Services;
|
|
||||||
using Managing.Infrastructure.Evm.Subgraphs;
|
|
||||||
using Managing.Infrastructure.Exchanges;
|
|
||||||
using Managing.Infrastructure.Exchanges.Abstractions;
|
|
||||||
using Managing.Infrastructure.Exchanges.Exchanges;
|
|
||||||
using Managing.Infrastructure.Messengers.Discord;
|
|
||||||
using Managing.Infrastructure.Storage;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Microsoft.Extensions.Options;
|
|
||||||
|
|
||||||
namespace Managing.Bootstrap;
|
|
||||||
|
|
||||||
public static class WorkersBootstrap
|
|
||||||
{
|
|
||||||
public static IServiceCollection RegisterWorkersDependencies(this IServiceCollection services,
|
|
||||||
IConfiguration configuration)
|
|
||||||
{
|
|
||||||
return services
|
|
||||||
.AddApplication()
|
|
||||||
.AddInfrastructure(configuration)
|
|
||||||
.AddWorkers(configuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static IServiceCollection AddApplication(this IServiceCollection services)
|
|
||||||
{
|
|
||||||
services.AddScoped<ITradingService, TradingService>();
|
|
||||||
services.AddScoped<IScenarioService, ScenarioService>();
|
|
||||||
services.AddScoped<IMoneyManagementService, MoneyManagementService>();
|
|
||||||
services.AddScoped<IAccountService, AccountService>();
|
|
||||||
services.AddScoped<IStatisticService, StatisticService>();
|
|
||||||
services.AddScoped<ISettingsService, SettingsService>();
|
|
||||||
services.AddScoped<IUserService, UserService>();
|
|
||||||
services.AddScoped<IGeneticService, GeneticService>();
|
|
||||||
services.AddScoped<IBotService, BotService>();
|
|
||||||
services.AddScoped<IWorkerService, WorkerService>();
|
|
||||||
services.AddScoped<ISynthPredictionService, SynthPredictionService>();
|
|
||||||
services.AddScoped<ISynthApiClient, SynthApiClient>();
|
|
||||||
services.AddScoped<IPricesService, PricesService>();
|
|
||||||
services.AddTransient<ICommandHandler<OpenPositionRequest, Position>, OpenPositionCommandHandler>();
|
|
||||||
services.AddTransient<ICommandHandler<ClosePositionCommand, Position>, ClosePositionCommandHandler>();
|
|
||||||
|
|
||||||
// Processors
|
|
||||||
services.AddTransient<IBacktester, Backtester>();
|
|
||||||
services.AddTransient<IExchangeProcessor, EvmProcessor>();
|
|
||||||
|
|
||||||
services.AddTransient<ITradaoService, TradaoService>();
|
|
||||||
services.AddTransient<IExchangeService, ExchangeService>();
|
|
||||||
services.AddTransient<IExchangeStream, ExchangeStream>();
|
|
||||||
|
|
||||||
|
|
||||||
services.AddTransient<IPrivyService, PrivyService>();
|
|
||||||
services.AddTransient<IWeb3ProxyService, Web3ProxyService>();
|
|
||||||
services.AddTransient<IWebhookService, WebhookService>();
|
|
||||||
services.AddTransient<IKaigenService, KaigenService>();
|
|
||||||
|
|
||||||
services.AddSingleton<IMessengerService, MessengerService>();
|
|
||||||
services.AddSingleton<IDiscordService, DiscordService>();
|
|
||||||
|
|
||||||
return services;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static IServiceCollection AddWorkers(this IServiceCollection services, IConfiguration configuration)
|
|
||||||
{
|
|
||||||
// Price Workers
|
|
||||||
if (configuration.GetValue<bool>("WorkerPricesFifteenMinutes", false))
|
|
||||||
{
|
|
||||||
services.AddHostedService<PricesFifteenMinutesWorker>();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (configuration.GetValue<bool>("WorkerPricesOneHour", false))
|
|
||||||
{
|
|
||||||
services.AddHostedService<PricesOneHourWorker>();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (configuration.GetValue<bool>("WorkerPricesFourHours", false))
|
|
||||||
{
|
|
||||||
services.AddHostedService<PricesFourHoursWorker>();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (configuration.GetValue<bool>("WorkerPricesOneDay", false))
|
|
||||||
{
|
|
||||||
services.AddHostedService<PricesOneDayWorker>();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (configuration.GetValue<bool>("WorkerPricesFiveMinutes", false))
|
|
||||||
{
|
|
||||||
services.AddHostedService<PricesFiveMinutesWorker>();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (configuration.GetValue<bool>("WorkerSpotlight", false))
|
|
||||||
{
|
|
||||||
services.AddHostedService<SpotlightWorker>();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (configuration.GetValue<bool>("WorkerTraderWatcher", false))
|
|
||||||
{
|
|
||||||
services.AddHostedService<TraderWatcher>();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (configuration.GetValue<bool>("WorkerLeaderboard", false))
|
|
||||||
{
|
|
||||||
services.AddHostedService<LeaderboardWorker>();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (configuration.GetValue<bool>("WorkerFundingRatesWatcher", false))
|
|
||||||
{
|
|
||||||
services.AddHostedService<FundingRatesWatcher>();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (configuration.GetValue<bool>("WorkerGeneticAlgorithm", false))
|
|
||||||
{
|
|
||||||
services.AddHostedService<GeneticAlgorithmWorker>();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (configuration.GetValue<bool>("WorkerBundleBacktest", false))
|
|
||||||
{
|
|
||||||
services.AddHostedService<BundleBacktestWorker>();
|
|
||||||
}
|
|
||||||
|
|
||||||
return services;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration)
|
|
||||||
{
|
|
||||||
// Database
|
|
||||||
services.AddSingleton<IPostgreSqlSettings>(sp =>
|
|
||||||
sp.GetRequiredService<IOptions<PostgreSqlSettings>>().Value);
|
|
||||||
|
|
||||||
services.AddSingleton<IInfluxDbSettings>(sp =>
|
|
||||||
sp.GetRequiredService<IOptions<InfluxDbSettings>>().Value);
|
|
||||||
|
|
||||||
services.AddTransient<IInfluxDbRepository, InfluxDbRepository>();
|
|
||||||
|
|
||||||
services.AddSingleton<IPrivySettings>(sp =>
|
|
||||||
sp.GetRequiredService<IOptions<PrivySettings>>().Value);
|
|
||||||
|
|
||||||
// Evm
|
|
||||||
services.AddUniswapV2();
|
|
||||||
services.AddGbcFeed();
|
|
||||||
services.AddChainlink();
|
|
||||||
services.AddChainlinkGmx();
|
|
||||||
services.AddSingleton<IEvmManager, EvmManager>();
|
|
||||||
|
|
||||||
// Repositories
|
|
||||||
services.AddTransient<ICandleRepository, CandleRepository>();
|
|
||||||
services.AddTransient<IAgentBalanceRepository, AgentBalanceRepository>();
|
|
||||||
services.AddTransient<IWorkerRepository, PostgreSqlWorkerRepository>();
|
|
||||||
services.AddTransient<IStatisticRepository, PostgreSqlStatisticRepository>();
|
|
||||||
services.AddTransient<ICandleRepository, CandleRepository>();
|
|
||||||
services.AddTransient<IAccountRepository, PostgreSqlAccountRepository>();
|
|
||||||
services.AddTransient<ISettingsRepository, PostgreSqlSettingsRepository>();
|
|
||||||
services.AddTransient<ITradingRepository, PostgreSqlTradingRepository>();
|
|
||||||
services.AddTransient<IBacktestRepository, PostgreSqlBacktestRepository>();
|
|
||||||
services.AddTransient<IBotRepository, PostgreSqlBotRepository>();
|
|
||||||
services.AddTransient<IUserRepository, PostgreSqlUserRepository>();
|
|
||||||
services.AddTransient<ISynthRepository, PostgreSqlSynthRepository>();
|
|
||||||
services.AddTransient<IGeneticRepository, PostgreSqlGeneticRepository>();
|
|
||||||
|
|
||||||
// Cache
|
|
||||||
services.AddDistributedMemoryCache();
|
|
||||||
services.AddTransient<ICacheService, CacheService>();
|
|
||||||
services.AddTransient<ITaskCache, TaskCache>();
|
|
||||||
|
|
||||||
|
|
||||||
// Processors
|
|
||||||
services.AddTransient<IExchangeProcessor, EvmProcessor>();
|
|
||||||
|
|
||||||
// Web Clients
|
|
||||||
services.AddTransient<ITradaoService, TradaoService>();
|
|
||||||
services.AddTransient<IExchangeService, ExchangeService>();
|
|
||||||
services.AddSingleton<IPrivyService, PrivyService>();
|
|
||||||
services.AddSingleton<ISynthApiClient, SynthApiClient>();
|
|
||||||
|
|
||||||
// Web3Proxy Configuration
|
|
||||||
services.Configure<Web3ProxySettings>(configuration.GetSection("Web3Proxy"));
|
|
||||||
services.AddTransient<IWeb3ProxyService, Web3ProxyService>();
|
|
||||||
|
|
||||||
// Http Clients
|
|
||||||
services.AddHttpClient();
|
|
||||||
|
|
||||||
// Messengers
|
|
||||||
services.AddSingleton<IMessengerService, MessengerService>();
|
|
||||||
services.AddSingleton<IDiscordService, DiscordService>();
|
|
||||||
services.AddSingleton<IWebhookService, WebhookService>();
|
|
||||||
|
|
||||||
return services;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -19,28 +19,6 @@ services:
|
|||||||
depends_on:
|
depends_on:
|
||||||
- managingdb
|
- managingdb
|
||||||
|
|
||||||
managing.api.workers:
|
|
||||||
environment:
|
|
||||||
- ASPNETCORE_ENVIRONMENT=Oda-docker
|
|
||||||
- ASPNETCORE_URLS=https://+:443;http://+:80
|
|
||||||
- ASPNETCORE_Kestrel__Certificates__Default__Password=!Managing94
|
|
||||||
- ASPNETCORE_Kestrel__Certificates__Default__Path=/app/managing_cert.pfx
|
|
||||||
ports:
|
|
||||||
- "81:80"
|
|
||||||
- "444:443"
|
|
||||||
volumes:
|
|
||||||
- ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
|
|
||||||
- /Users/oda/ASP.NET/Https:/root/.aspnet/https:ro
|
|
||||||
depends_on:
|
|
||||||
- managingdb
|
|
||||||
|
|
||||||
managingdb:
|
|
||||||
restart: always
|
|
||||||
volumes:
|
|
||||||
- mongodata:/data/db
|
|
||||||
ports:
|
|
||||||
- "27017:27017"
|
|
||||||
|
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:17.5
|
image: postgres:17.5
|
||||||
volumes:
|
volumes:
|
||||||
|
|||||||
@@ -1,11 +1,6 @@
|
|||||||
version: '3.4'
|
version: '3.4'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
managingdb:
|
|
||||||
image: mongo
|
|
||||||
networks:
|
|
||||||
- managing-network
|
|
||||||
|
|
||||||
managing.api:
|
managing.api:
|
||||||
image: ${DOCKER_REGISTRY-}managingapi
|
image: ${DOCKER_REGISTRY-}managingapi
|
||||||
build:
|
build:
|
||||||
@@ -14,14 +9,6 @@ services:
|
|||||||
networks:
|
networks:
|
||||||
- managing-network
|
- managing-network
|
||||||
|
|
||||||
managing.api.workers:
|
|
||||||
image: ${DOCKER_REGISTRY-}managingapiworkers
|
|
||||||
build:
|
|
||||||
context: ../.
|
|
||||||
dockerfile: Managing.Api.Workers/Dockerfile
|
|
||||||
networks:
|
|
||||||
- managing-network
|
|
||||||
|
|
||||||
influxdb:
|
influxdb:
|
||||||
image: influxdb:latest
|
image: influxdb:latest
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -11,6 +11,5 @@ export { default as CustomScenario } from './CustomScenario/CustomScenario'
|
|||||||
export { default as SpotLightBadge } from './SpotLightBadge/SpotLightBadge'
|
export { default as SpotLightBadge } from './SpotLightBadge/SpotLightBadge'
|
||||||
export { default as StatusBadge } from './StatusBadge/StatusBadge'
|
export { default as StatusBadge } from './StatusBadge/StatusBadge'
|
||||||
export { default as PositionsList } from './Positions/PositionList'
|
export { default as PositionsList } from './Positions/PositionList'
|
||||||
export { default as WorkflowCanvas } from './Workflow/workflowCanvas'
|
|
||||||
export { default as ScenarioModal } from './ScenarioModal'
|
export { default as ScenarioModal } from './ScenarioModal'
|
||||||
export { default as BotNameModal } from './BotNameModal/BotNameModal'
|
export { default as BotNameModal } from './BotNameModal/BotNameModal'
|
||||||
|
|||||||
@@ -45,8 +45,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Managing.Application.Tests"
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Managing.Infrastructure.Messengers", "Managing.Infrastructure.Messengers\Managing.Infrastructure.Messengers.csproj", "{AD40302A-27C7-4E9D-B644-C7B141571EAF}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Managing.Infrastructure.Messengers", "Managing.Infrastructure.Messengers\Managing.Infrastructure.Messengers.csproj", "{AD40302A-27C7-4E9D-B644-C7B141571EAF}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Managing.Api.Workers", "Managing.Api.Workers\Managing.Api.Workers.csproj", "{0DC797C2-007C-496E-B4C9-FDBD29D4EF4E}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Managing.Infrastructure.Databases", "Managing.Infrastructure.Database\Managing.Infrastructure.Databases.csproj", "{E6CB238E-8F60-4139-BDE6-31534832198E}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Managing.Infrastructure.Databases", "Managing.Infrastructure.Database\Managing.Infrastructure.Databases.csproj", "{E6CB238E-8F60-4139-BDE6-31534832198E}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Managing.Application.Abstractions", "Managing.Application.Abstractions\Managing.Application.Abstractions.csproj", "{283AC491-97C3-49E0-AB17-272EFB4E5A9C}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Managing.Application.Abstractions", "Managing.Application.Abstractions\Managing.Application.Abstractions.csproj", "{283AC491-97C3-49E0-AB17-272EFB4E5A9C}"
|
||||||
@@ -166,14 +164,6 @@ Global
|
|||||||
{AD40302A-27C7-4E9D-B644-C7B141571EAF}.Release|Any CPU.Build.0 = Release|Any CPU
|
{AD40302A-27C7-4E9D-B644-C7B141571EAF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{AD40302A-27C7-4E9D-B644-C7B141571EAF}.Release|x64.ActiveCfg = Release|Any CPU
|
{AD40302A-27C7-4E9D-B644-C7B141571EAF}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
{AD40302A-27C7-4E9D-B644-C7B141571EAF}.Release|x64.Build.0 = Release|Any CPU
|
{AD40302A-27C7-4E9D-B644-C7B141571EAF}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{0DC797C2-007C-496E-B4C9-FDBD29D4EF4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{0DC797C2-007C-496E-B4C9-FDBD29D4EF4E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{0DC797C2-007C-496E-B4C9-FDBD29D4EF4E}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{0DC797C2-007C-496E-B4C9-FDBD29D4EF4E}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{0DC797C2-007C-496E-B4C9-FDBD29D4EF4E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{0DC797C2-007C-496E-B4C9-FDBD29D4EF4E}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{0DC797C2-007C-496E-B4C9-FDBD29D4EF4E}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{0DC797C2-007C-496E-B4C9-FDBD29D4EF4E}.Release|x64.Build.0 = Release|x64
|
|
||||||
{E6CB238E-8F60-4139-BDE6-31534832198E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{E6CB238E-8F60-4139-BDE6-31534832198E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{E6CB238E-8F60-4139-BDE6-31534832198E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{E6CB238E-8F60-4139-BDE6-31534832198E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{E6CB238E-8F60-4139-BDE6-31534832198E}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{E6CB238E-8F60-4139-BDE6-31534832198E}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
@@ -262,7 +252,6 @@ Global
|
|||||||
{837B12AD-E96C-40CE-9DEE-931442A6C15E} = {E453D33B-5C2B-4AA1-834D-2C916EC95FC6}
|
{837B12AD-E96C-40CE-9DEE-931442A6C15E} = {E453D33B-5C2B-4AA1-834D-2C916EC95FC6}
|
||||||
{35A05E76-29F6-4DC1-886D-FD69926CB490} = {8F2ECEA7-5BCA-45DF-B6E3-88AADD7AFD45}
|
{35A05E76-29F6-4DC1-886D-FD69926CB490} = {8F2ECEA7-5BCA-45DF-B6E3-88AADD7AFD45}
|
||||||
{AD40302A-27C7-4E9D-B644-C7B141571EAF} = {E453D33B-5C2B-4AA1-834D-2C916EC95FC6}
|
{AD40302A-27C7-4E9D-B644-C7B141571EAF} = {E453D33B-5C2B-4AA1-834D-2C916EC95FC6}
|
||||||
{0DC797C2-007C-496E-B4C9-FDBD29D4EF4E} = {A1296069-2816-43D4-882C-516BCB718D03}
|
|
||||||
{E6CB238E-8F60-4139-BDE6-31534832198E} = {E453D33B-5C2B-4AA1-834D-2C916EC95FC6}
|
{E6CB238E-8F60-4139-BDE6-31534832198E} = {E453D33B-5C2B-4AA1-834D-2C916EC95FC6}
|
||||||
{283AC491-97C3-49E0-AB17-272EFB4E5A9C} = {F6774DB0-DF13-4077-BC94-0E67EE105C4C}
|
{283AC491-97C3-49E0-AB17-272EFB4E5A9C} = {F6774DB0-DF13-4077-BC94-0E67EE105C4C}
|
||||||
{CDDF92D4-9D2E-4134-BD44-3064D6EF462D} = {E453D33B-5C2B-4AA1-834D-2C916EC95FC6}
|
{CDDF92D4-9D2E-4134-BD44-3064D6EF462D} = {E453D33B-5C2B-4AA1-834D-2C916EC95FC6}
|
||||||
|
|||||||
Reference in New Issue
Block a user