diff --git a/backend/config/settings/base.py b/backend/config/settings/base.py index 998807b2..324091ff 100644 --- a/backend/config/settings/base.py +++ b/backend/config/settings/base.py @@ -263,13 +263,28 @@ if not EMAIL_HOST: MEDIA_ROOT = env("MEDIA_ROOT", path.join(BASE_DIR, "media")) MEDIA_URL = "/media/" -# Filepond settings +# Ensure media directory exists +import os +if not os.path.exists(MEDIA_ROOT): + os.makedirs(MEDIA_ROOT, exist_ok=True) + +# Filepond settings - place this AFTER MEDIA_ROOT definition DJANGO_DRF_FILEPOND_UPLOAD_TMP = path.join(BASE_DIR, "filepond-temp-uploads") -DJANGO_DRF_FILEPOND_FILE_STORE_PATH = MEDIA_ROOT +DJANGO_DRF_FILEPOND_FILE_STORE_PATH = MEDIA_ROOT # This ensures the path is available + +# Ensure filepond temp directory exists +if not os.path.exists(DJANGO_DRF_FILEPOND_UPLOAD_TMP): + os.makedirs(DJANGO_DRF_FILEPOND_UPLOAD_TMP, exist_ok=True) # File upload setting MAX_UPLOAD_SIZE = env.int("MAX_UPLOAD_SIZE", pow(1024, 3)) # default: 1GB per a file ENABLE_FILE_TYPE_CHECK = env.bool("ENABLE_FILE_TYPE_CHECK", False) +# Add temporary file handling settings +FILE_UPLOAD_HANDLERS = [ + 'django.core.files.uploadhandler.MemoryFileUploadHandler', + 'django.core.files.uploadhandler.TemporaryFileUploadHandler', +] +FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440 # 2.5 MB # Celery settings DJANGO_CELERY_RESULTS_TASK_ID_MAX_LENGTH = 191 @@ -289,29 +304,32 @@ except EnvError: CELERY_ACCEPT_CONTENT = ["application/json"] CELERY_TASK_SERIALIZER = "json" CELERY_RESULT_SERIALIZER = "json" +CELERY_TASK_TIME_LIMIT = 600 # Add timeout for tasks +CELERY_TASK_SOFT_TIME_LIMIT = 500 -# Fix for macOS Celery fork() issue +# Fix for Windows and macOS Celery issues import os import platform if platform.system() == 'Darwin': # macOS os.environ['OBJC_DISABLE_INITIALIZE_FORK_SAFETY'] = 'YES' +elif platform.system() == 'Windows': # Windows + # Windows-specific settings + os.environ['FORKED_BY_MULTIPROCESSING'] = '1' -# Configure Celery to use 'spawn' instead of 'fork' on macOS +# Configure Celery worker settings CELERY_WORKER_CONCURRENCY = env.int('CELERY_WORKER_CONCURRENCY', 2) -if platform.system() == 'Darwin': - CELERY_TASK_CREATE_MISSING_QUEUES = True - CELERY_WORKER_MAX_TASKS_PER_CHILD = 1000 - CELERY_WORKER_PREFETCH_MULTIPLIER = 1 - CELERY_WORKER_FORCE_EXECV = True - # Make Celery explicitly use spawn method on macOS - CELERY_WORKER_POOL = 'solo' # Use 'solo' pool to avoid forking issues - - # SQLAlchemy broker options (remove incompatible options) - # CELERY_BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600} # Remove this line +CELERY_TASK_CREATE_MISSING_QUEUES = True +CELERY_WORKER_MAX_TASKS_PER_CHILD = 1000 +CELERY_WORKER_PREFETCH_MULTIPLIER = 1 +CELERY_WORKER_FORCE_EXECV = True + +# Use appropriate pool based on platform +if platform.system() in ['Darwin', 'Windows']: + CELERY_WORKER_POOL = 'solo' # Use 'solo' pool to avoid forking issues on macOS and Windows # Also set these for command-line options import multiprocessing - multiprocessing.set_start_method('spawn') + multiprocessing.set_start_method('spawn', force=True) DEFAULT_AUTO_FIELD = "django.db.models.AutoField" diff --git a/frontend/repositories/upload/apiParseRepository.ts b/frontend/repositories/upload/apiParseRepository.ts index ce4769e6..00c49998 100644 --- a/frontend/repositories/upload/apiParseRepository.ts +++ b/frontend/repositories/upload/apiParseRepository.ts @@ -17,12 +17,25 @@ export class APIParseRepository { uploadIds, ...option } - const response = await this.request.post(url, data) - return response.data.task_id + // Add timeout and error handling + try { + const response = await this.request.post(url, data, { + timeout: 60000, // 60 seconds timeout + }) + return response.data.task_id + } catch (error) { + console.error('Upload analysis error:', error) + throw error + } } revert(serverId: string): void { const url = `/fp/revert/` - this.request.delete(url, { data: serverId }) + // Use proper format for DELETE request + try { + this.request.delete(url, { data: { id: serverId } }) + } catch (error) { + console.error('Revert error:', error) + } } }