Compare commits
2 Commits
9b6a393e06
...
8cfb13f728
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8cfb13f728 | ||
|
|
8a71e0f748 |
@@ -1,8 +1,7 @@
|
|||||||
version: '2.4'
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
app:
|
app:
|
||||||
container_name: trader_dev
|
container_name: trader_dev
|
||||||
|
restart: unless-stopped
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
@@ -52,8 +51,6 @@ services:
|
|||||||
- ./lib:/app/lib:cached
|
- ./lib:/app/lib:cached
|
||||||
- ./components:/app/components:cached
|
- ./components:/app/components:cached
|
||||||
- ./package.json:/app/package.json:ro
|
- ./package.json:/app/package.json:ro
|
||||||
# Mount root JavaScript files for Enhanced Risk Manager
|
|
||||||
- ./start-enhanced-risk-manager.js:/app/start-enhanced-risk-manager.js:ro
|
|
||||||
|
|
||||||
# Port mapping for development
|
# Port mapping for development
|
||||||
ports:
|
ports:
|
||||||
@@ -69,46 +66,3 @@ services:
|
|||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 2
|
retries: 2
|
||||||
start_period: 15s
|
start_period: 15s
|
||||||
|
|
||||||
# Enhanced Risk Manager as separate service
|
|
||||||
risk_manager:
|
|
||||||
container_name: enhanced_risk_manager
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
args:
|
|
||||||
- BUILDKIT_INLINE_CACHE=1
|
|
||||||
- NODE_VERSION=20.11.1
|
|
||||||
- PNPM_VERSION=8.15.1
|
|
||||||
|
|
||||||
# Override entrypoint and command to run Enhanced Risk Manager directly
|
|
||||||
entrypoint: []
|
|
||||||
command: ["node", "start-enhanced-risk-manager.js"]
|
|
||||||
|
|
||||||
# Enhanced Risk Manager environment
|
|
||||||
environment:
|
|
||||||
- NODE_ENV=development
|
|
||||||
- DOCKER_ENV=true
|
|
||||||
- DATABASE_URL=file:./prisma/dev.db
|
|
||||||
- TZ=Europe/Berlin
|
|
||||||
|
|
||||||
# Load environment variables from .env file
|
|
||||||
env_file:
|
|
||||||
- .env
|
|
||||||
|
|
||||||
# Enhanced Risk Manager volumes
|
|
||||||
volumes:
|
|
||||||
- ./lib:/app/lib:cached
|
|
||||||
- ./prisma:/app/prisma:cached
|
|
||||||
- ./start-enhanced-risk-manager.js:/app/start-enhanced-risk-manager.js:ro
|
|
||||||
|
|
||||||
# Working directory
|
|
||||||
working_dir: /app
|
|
||||||
|
|
||||||
# Depends on the main app being healthy
|
|
||||||
depends_on:
|
|
||||||
app:
|
|
||||||
condition: service_healthy
|
|
||||||
|
|
||||||
# Restart policy
|
|
||||||
restart: unless-stopped
|
|
||||||
@@ -53,19 +53,20 @@ export class AutomatedCleanupService {
|
|||||||
console.log('Could not list processes:', listError)
|
console.log('Could not list processes:', listError)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Kill old/stuck processes
|
// Kill old/stuck processes (but exclude our own Node.js process)
|
||||||
|
const currentPid = process.pid
|
||||||
const killCommands = [
|
const killCommands = [
|
||||||
// Graceful shutdown first
|
// Graceful shutdown first (exclude our process and children)
|
||||||
'pkill -TERM -f "chromium.*--remote-debugging-port" 2>/dev/null || true',
|
`pkill -TERM -f "chromium.*--remote-debugging-port" | grep -v ${currentPid} 2>/dev/null || true`,
|
||||||
'pkill -TERM -f "chromium.*--user-data-dir" 2>/dev/null || true',
|
`pkill -TERM -f "chromium.*--user-data-dir" | grep -v ${currentPid} 2>/dev/null || true`,
|
||||||
|
|
||||||
// Wait a bit
|
// Wait a bit
|
||||||
'sleep 2',
|
'sleep 2',
|
||||||
|
|
||||||
// Force kill stubborn processes
|
// Force kill stubborn processes (exclude our process and children)
|
||||||
'pkill -KILL -f "chromium.*--remote-debugging-port" 2>/dev/null || true',
|
`pkill -KILL -f "chromium.*--remote-debugging-port" | grep -v ${currentPid} 2>/dev/null || true`,
|
||||||
'pkill -KILL -f "chromium.*--user-data-dir" 2>/dev/null || true',
|
`pkill -KILL -f "chromium.*--user-data-dir" | grep -v ${currentPid} 2>/dev/null || true`,
|
||||||
'pkill -KILL -f "/usr/lib/chromium/chromium" 2>/dev/null || true',
|
`pkill -KILL -f "/usr/lib/chromium/chromium" | grep -v ${currentPid} 2>/dev/null || true`,
|
||||||
|
|
||||||
// Clean up zombies
|
// Clean up zombies
|
||||||
'pkill -9 -f "chromium.*defunct" 2>/dev/null || true'
|
'pkill -9 -f "chromium.*defunct" 2>/dev/null || true'
|
||||||
@@ -121,8 +122,10 @@ export class AutomatedCleanupService {
|
|||||||
// Create singleton instance
|
// Create singleton instance
|
||||||
export const automatedCleanupService = new AutomatedCleanupService()
|
export const automatedCleanupService = new AutomatedCleanupService()
|
||||||
|
|
||||||
// Auto-start in Docker environment
|
// Auto-start in Docker environment (unless disabled)
|
||||||
if (process.env.DOCKER_ENV === 'true') {
|
if (process.env.DOCKER_ENV === 'true' && process.env.DISABLE_AUTO_CLEANUP !== 'true') {
|
||||||
console.log('🐳 Docker environment detected - starting automated cleanup service')
|
console.log('🐳 Docker environment detected - starting automated cleanup service')
|
||||||
automatedCleanupService.start(30000) // Every 30 seconds in Docker
|
automatedCleanupService.start(30000) // Every 30 seconds in Docker
|
||||||
|
} else if (process.env.DOCKER_ENV === 'true' && process.env.DISABLE_AUTO_CLEANUP === 'true') {
|
||||||
|
console.log('🐳 Docker environment detected but auto cleanup is disabled via DISABLE_AUTO_CLEANUP=true')
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class SimplifiedStopLossLearner {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const prisma = await getDB();
|
const prisma = await getDB();
|
||||||
const record = await prisma.aILearningData.create({
|
const record = await prisma.ai_learning_data.create({
|
||||||
data: decision
|
data: decision
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ class SimplifiedStopLossLearner {
|
|||||||
async updateDecisionOutcome(decisionId, outcomeData) {
|
async updateDecisionOutcome(decisionId, outcomeData) {
|
||||||
try {
|
try {
|
||||||
const prisma = await getDB();
|
const prisma = await getDB();
|
||||||
await prisma.aILearningData.update({
|
await prisma.ai_learning_data.update({
|
||||||
where: { id: decisionId },
|
where: { id: decisionId },
|
||||||
data: {
|
data: {
|
||||||
outcome: outcomeData.outcome,
|
outcome: outcomeData.outcome,
|
||||||
@@ -93,7 +93,7 @@ class SimplifiedStopLossLearner {
|
|||||||
async analyzeDecisionPatterns() {
|
async analyzeDecisionPatterns() {
|
||||||
try {
|
try {
|
||||||
const prisma = await getDB();
|
const prisma = await getDB();
|
||||||
const decisions = await prisma.aILearningData.findMany({
|
const decisions = await prisma.ai_learning_data.findMany({
|
||||||
where: {
|
where: {
|
||||||
analysisData: {
|
analysisData: {
|
||||||
string_contains: '"type":"STOP_LOSS_DECISION"'
|
string_contains: '"type":"STOP_LOSS_DECISION"'
|
||||||
@@ -159,7 +159,7 @@ class SimplifiedStopLossLearner {
|
|||||||
|
|
||||||
// Find similar situations
|
// Find similar situations
|
||||||
const prisma = await getDB();
|
const prisma = await getDB();
|
||||||
const similarDecisions = await prisma.aILearningData.findMany({
|
const similarDecisions = await prisma.ai_learning_data.findMany({
|
||||||
where: {
|
where: {
|
||||||
analysisData: {
|
analysisData: {
|
||||||
string_contains: '"type":"STOP_LOSS_DECISION"'
|
string_contains: '"type":"STOP_LOSS_DECISION"'
|
||||||
@@ -237,7 +237,7 @@ class SimplifiedStopLossLearner {
|
|||||||
async getLearningStatus() {
|
async getLearningStatus() {
|
||||||
try {
|
try {
|
||||||
const prisma = await getDB();
|
const prisma = await getDB();
|
||||||
const totalDecisions = await prisma.aILearningData.count({
|
const totalDecisions = await prisma.ai_learning_data.count({
|
||||||
where: {
|
where: {
|
||||||
analysisData: {
|
analysisData: {
|
||||||
string_contains: '"type":"STOP_LOSS_DECISION"'
|
string_contains: '"type":"STOP_LOSS_DECISION"'
|
||||||
@@ -245,7 +245,7 @@ class SimplifiedStopLossLearner {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const recentDecisions = await prisma.aILearningData.count({
|
const recentDecisions = await prisma.ai_learning_data.count({
|
||||||
where: {
|
where: {
|
||||||
analysisData: {
|
analysisData: {
|
||||||
string_contains: '"type":"STOP_LOSS_DECISION"'
|
string_contains: '"type":"STOP_LOSS_DECISION"'
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user