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:
BIN
app/static/uploads/Castle_192452700-CSL._V392937836_RI_.jpg
Normal file
BIN
app/static/uploads/Castle_192452700-CSL._V392937836_RI_.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 331 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 432 KiB |
Binary file not shown.
@@ -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):
|
||||||
|
|||||||
@@ -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/"]
|
||||||
|
|||||||
Reference in New Issue
Block a user