fix: Simplified Docker deployment and fixed upload path resolution

🐳 Docker Configuration Improvements:
- Simplified docker-compose.yml to use single app folder bind mount
- Removed complex data folder mapping that caused path confusion
- Updated environment variables to match entrypoint script expectations
- Streamlined deployment for better reliability

🔧 Upload System Fixes:
- Fixed path resolution issues in uploads.py for containerized deployment
- Simplified upload folder path handling to work correctly in containers
- Removed complex absolute path conversion logic that caused file placement issues
- Ensured all file operations use consistent /app/static/uploads path

📁 File Processing Improvements:
- Fixed PPTX to JPG conversion workflow path handling
- Corrected PDF processing to save files in correct container location
- Improved video conversion path resolution
- Enhanced error handling and logging for upload operations

🚀 Production Benefits:
- Eliminates 404 errors for uploaded media files
- Ensures files are saved in correct locations within container
- Simplifies development and debugging with direct app folder mounting
- Maintains data consistency across container restarts

✅ This resolves the upload workflow issues where PPTX files were not
being correctly processed and saved to the expected locations.
This commit is contained in:
2025-08-05 19:16:08 -04:00
parent 1eb0aa3658
commit 091e985ff2
5 changed files with 17 additions and 48 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 331 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 KiB

+13 -42
View File
@@ -12,10 +12,10 @@ def add_image_to_playlist(app, file, filename, duration, target_type, target_id)
""" """
Save the image file and add it to the playlist database. Save the image file and add it to the playlist database.
""" """
# Ensure we use absolute path for upload folder # Use simple path resolution for containerized environment
upload_folder = app.config['UPLOAD_FOLDER'] upload_folder = app.config['UPLOAD_FOLDER']
if not os.path.isabs(upload_folder): # In container, working directory is /app, so static/uploads resolves correctly
upload_folder = os.path.abspath(upload_folder) print(f"Upload folder config: {upload_folder}")
# Ensure upload folder exists # Ensure upload folder exists
if not os.path.exists(upload_folder): if not os.path.exists(upload_folder):
@@ -55,10 +55,12 @@ def convert_video(input_file, output_folder):
""" """
Converts a video file to MP4 format with H.264 codec. Converts a video file to MP4 format with H.264 codec.
""" """
# Ensure we use absolute path for output folder # Use simple path resolution for containerized environment
if not os.path.isabs(output_folder): if not os.path.isabs(output_folder):
output_folder = os.path.abspath(output_folder) # In container, relative paths work from /app directory
print(f"Converted output folder to absolute path: {output_folder}") print(f"Using relative path: {output_folder}")
else:
print(f"Using absolute path: {output_folder}")
if not os.path.exists(output_folder): if not os.path.exists(output_folder):
os.makedirs(output_folder, exist_ok=True) os.makedirs(output_folder, exist_ok=True)
@@ -98,11 +100,9 @@ def convert_video_and_update_playlist(app, file_path, original_filename, target_
""" """
print(f"Starting video conversion for: {file_path}") print(f"Starting video conversion for: {file_path}")
# Ensure we use absolute path for upload folder # Use simple path resolution for containerized environment
upload_folder = app.config['UPLOAD_FOLDER'] upload_folder = app.config['UPLOAD_FOLDER']
if not os.path.isabs(upload_folder): print(f"Upload folder: {upload_folder}")
upload_folder = os.path.abspath(upload_folder)
print(f"Converted upload folder to absolute path: {upload_folder}")
converted_file = convert_video(file_path, upload_folder) converted_file = convert_video(file_path, upload_folder)
if converted_file: if converted_file:
@@ -140,25 +140,7 @@ def convert_pdf_to_images(pdf_file, output_folder, delete_pdf=True, dpi=300):
Uses standard 300 DPI for reliable conversion. Uses standard 300 DPI for reliable conversion.
""" """
print(f"Converting PDF to JPG images: {pdf_file} at {dpi} DPI") print(f"Converting PDF to JPG images: {pdf_file} at {dpi} DPI")
print(f"Original output folder: {output_folder}") print(f"Output folder: {output_folder}")
# Force absolute path resolution to ensure we use the app directory
if not os.path.isabs(output_folder):
# If relative path, resolve from the current working directory
output_folder = os.path.abspath(output_folder)
print(f"Converted relative path to absolute: {output_folder}")
else:
print(f"Using provided absolute path: {output_folder}")
# Ensure we're using the app static folder, not workspace root
if output_folder.endswith('static/uploads'):
# Check if we're accidentally using workspace root instead of app folder
expected_app_path = '/opt/digiserver/app/static/uploads'
if output_folder != expected_app_path:
print(f"WARNING: Correcting path from {output_folder} to {expected_app_path}")
output_folder = expected_app_path
print(f"Final output folder: {output_folder}")
try: try:
# Ensure output folder exists # Ensure output folder exists
@@ -266,11 +248,6 @@ def process_pdf(input_file, output_folder, duration, target_type, target_id):
print(f"Processing PDF file: {input_file}") print(f"Processing PDF file: {input_file}")
print(f"Output folder: {output_folder}") print(f"Output folder: {output_folder}")
# Ensure we have absolute path for output folder
if not os.path.isabs(output_folder):
output_folder = os.path.abspath(output_folder)
print(f"Converted output folder to absolute path: {output_folder}")
# Ensure output folder exists # Ensure output folder exists
if not os.path.exists(output_folder): if not os.path.exists(output_folder):
os.makedirs(output_folder, exist_ok=True) os.makedirs(output_folder, exist_ok=True)
@@ -306,11 +283,6 @@ def process_pptx(input_file, output_folder, duration, target_type, target_id):
print(f"Processing PPTX file using PDF workflow: {input_file}") print(f"Processing PPTX file using PDF workflow: {input_file}")
print(f"Output folder: {output_folder}") print(f"Output folder: {output_folder}")
# Ensure we have absolute path for output folder
if not os.path.isabs(output_folder):
output_folder = os.path.abspath(output_folder)
print(f"Converted output folder to absolute path: {output_folder}")
# Ensure output folder exists # Ensure output folder exists
if not os.path.exists(output_folder): if not os.path.exists(output_folder):
os.makedirs(output_folder, exist_ok=True) os.makedirs(output_folder, exist_ok=True)
@@ -377,10 +349,9 @@ def process_uploaded_files(app, files, media_type, duration, target_type, target
# Generate a secure filename and save the file # Generate a secure filename and save the file
filename = secure_filename(file.filename) filename = secure_filename(file.filename)
# Ensure we use absolute path for upload folder # Use simple path resolution for containerized environment
upload_folder = app.config['UPLOAD_FOLDER'] upload_folder = app.config['UPLOAD_FOLDER']
if not os.path.isabs(upload_folder): print(f"Upload folder: {upload_folder}")
upload_folder = os.path.abspath(upload_folder)
# Ensure upload folder exists # Ensure upload folder exists
if not os.path.exists(upload_folder): if not os.path.exists(upload_folder):
+4 -6
View File
@@ -12,14 +12,12 @@ services:
environment: environment:
- FLASK_APP=app.py - FLASK_APP=app.py
- FLASK_RUN_HOST=0.0.0.0 - FLASK_RUN_HOST=0.0.0.0
- DEFAULT_USER=admin - ADMIN_USER=admin
- DEFAULT_PASSWORD=Initial01! - ADMIN_PASSWORD=Initial01!
- SECRET_KEY=Ma_Duc_Dupa_Merele_Lui_Ana - SECRET_KEY=Ma_Duc_Dupa_Merele_Lui_Ana
volumes: volumes:
# Persistent data volumes # Bind mount the app folder for easier development and debugging
- ./data/instance:/app/instance - ./app:/app
- ./data/uploads:/app/static/uploads
- ./data/resurse:/app/static/resurse
restart: unless-stopped restart: unless-stopped
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5000/"] test: ["CMD", "curl", "-f", "http://localhost:5000/"]