#!/bin/bash set -e echo "=============================================" echo " Fragmenta — Docker Edition" echo "=============================================" # Use environment variables with sensible defaults HOST="${FLASK_HOST:-0.0.0.0}" PORT="${FLASK_PORT:-5001}" echo "Host: ${HOST}" echo "Port: ${PORT}" echo "=============================================" cd /app # ---- Ensure runtime directories exist (may be empty volume mounts) ---- mkdir -p /app/models/pretrained /app/models/fine_tuned /app/models/config \ /app/data /app/output /app/logs /app/config 2>/dev/null || true # ---- Diagnostics (helps debug failures on new machines) ---- echo "[startup] Python: $(python --version 2>&1)" echo "[startup] Working dir: $(pwd)" echo "[startup] User: $(whoami) (uid=$(id -u))" # Quick smoke-test: can we import the core deps? (avoid CUDA init — it's slow) echo "[startup] Checking core Python imports…" python -c " import flask, flask_cors, torch, torchaudio, soundfile print(f' Flask {flask.__version__} | torch {torch.__version__}') print(f' CUDA build: {torch.version.cuda or \"none\"}') print(' GPU detection deferred to first request (faster startup)') " || { echo "ERROR: Core Python imports failed. Check requirements." exit 1 } # Ensure model config files exist (they may be missing if /app/models is # an empty volume mount). Fallback copies are baked into the image under # /opt/fragmenta-defaults/models/config/ during the Docker build. if [ -d /opt/fragmenta-defaults/models/config ]; then for f in /opt/fragmenta-defaults/models/config/*; do fname=$(basename "$f") if [ ! -f "/app/models/config/${fname}" ]; then echo "[startup] Restoring default config: ${fname}" cp "$f" "/app/models/config/${fname}" 2>/dev/null || true fi done fi echo "[startup] Starting Fragmenta on ${HOST}:${PORT}" echo "Open http://localhost:${PORT} in your browser" echo "=============================================" # Run Flask directly via Python (same way the desktop app does it) exec python -c " import os, sys sys.path.insert(0, '/app') os.environ['FLASK_HOST'] = '${HOST}' os.environ['FLASK_PORT'] = '${PORT}' from app.backend.app import app, QuietWSGIRequestHandler print('[server] Flask app imported — starting…', flush=True) app.run( host='${HOST}', port=int('${PORT}'), debug=False, use_reloader=False, request_handler=QuietWSGIRequestHandler, threaded=True ) "