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

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.
"""
# Ensure we use absolute path for upload folder
# Use simple path resolution for containerized environment
upload_folder = app.config['UPLOAD_FOLDER']
if not os.path.isabs(upload_folder):
upload_folder = os.path.abspath(upload_folder)
# In container, working directory is /app, so static/uploads resolves correctly
print(f"Upload folder config: {upload_folder}")
# Ensure upload folder exists
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.
"""
# Ensure we use absolute path for output folder
# Use simple path resolution for containerized environment
if not os.path.isabs(output_folder):
output_folder = os.path.abspath(output_folder)
print(f"Converted output folder to absolute path: {output_folder}")
# In container, relative paths work from /app directory
print(f"Using relative path: {output_folder}")
else:
print(f"Using absolute path: {output_folder}")
if not os.path.exists(output_folder):
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}")
# Ensure we use absolute path for upload folder
# Use simple path resolution for containerized environment
upload_folder = app.config['UPLOAD_FOLDER']
if not os.path.isabs(upload_folder):
upload_folder = os.path.abspath(upload_folder)
print(f"Converted upload folder to absolute path: {upload_folder}")
print(f"Upload folder: {upload_folder}")
converted_file = convert_video(file_path, upload_folder)
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.
"""
print(f"Converting PDF to JPG images: {pdf_file} at {dpi} DPI")
print(f"Original 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}")
print(f"Output folder: {output_folder}")
try:
# 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"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
if not os.path.exists(output_folder):
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"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
if not os.path.exists(output_folder):
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
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']
if not os.path.isabs(upload_folder):
upload_folder = os.path.abspath(upload_folder)
print(f"Upload folder: {upload_folder}")
# Ensure upload folder exists
if not os.path.exists(upload_folder):

View File

@@ -12,14 +12,12 @@ services:
environment:
- FLASK_APP=app.py
- FLASK_RUN_HOST=0.0.0.0
- DEFAULT_USER=admin
- DEFAULT_PASSWORD=Initial01!
- ADMIN_USER=admin
- ADMIN_PASSWORD=Initial01!
- SECRET_KEY=Ma_Duc_Dupa_Merele_Lui_Ana
volumes:
# Persistent data volumes
- ./data/instance:/app/instance
- ./data/uploads:/app/static/uploads
- ./data/resurse:/app/static/resurse
# Bind mount the app folder for easier development and debugging
- ./app:/app
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5000/"]