FROM python:3.11-slim-trixie # ffmpeg only. Recording/remux packages are not installed. RUN apt-get update && apt-get install -y --no-install-recommends ffmpeg ca-certificates tzdata && rm -rf /var/lib/apt/lists/* RUN ffmpeg -hide_banner -h protocol=rtmps 2>&1 | grep -q rtmp_enhanced_codecs WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -U -r requirements.txt COPY app.py relay.py youtube_api.py youtube_manager.py flv_bridge.py stream_monitor.py telemetry.py tiktok_auth.py ingest.py index.html ./ COPY verify.sh verify_tokens.py probe_live.py test_watchdog.py test_lifecycle.py test_relay.py test_source_reconnect.py test_ingest_routes.py test_transition_ingest.py test_concurrency.py test_flv_bridge.py test_adaptive_format.py test_regressions.py test_completion.py test_channel_switch.py test_dashboard.js test_telemetry.py test_smart_mode.py ./ # TikTok Live Monitor → Direct Relay → YouTube. No local video files. ENV TZ=Asia/Baghdad \ CHECK_INTERVAL=20 \ SOURCE_STALL_TIMEOUT=12 \ YOUTUBE_SOURCE_STALL_SECONDS=12 \ MAX_CONCURRENT_RELAYS=4 \ YOUTUBE_MAX_EVENTS=4 \ YOUTUBE_LIGHT_MAX=0 \ YOUTUBE_TITLE_TEMPLATE="{broadcaster} | {date} {time}" \ YOUTUBE_SEND_MODE=auto \ YOUTUBE_AUTO_TRANSCODE=0 \ YOUTUBE_AUDIO_PROFILE=aac_low \ YOUTUBE_AUDIO_BITRATE=128k \ YOUTUBE_AUDIO_CHANNELS=2 \ YOUTUBE_GOP=60 \ YOUTUBE_INPUT_RECOVERY=1 \ YOUTUBE_PREFER_H264=1 \ YOUTUBE_CODEC_FALLBACK_MODE=matchgop \ YOUTUBE_RETRY_MIN=1 \ YOUTUBE_RETRY_MAX=60 \ YOUTUBE_SOURCE_LIMIT=6 \ YOUTUBE_SOURCE_UPGRADE_SECONDS=300 \ YOUTUBE_FLAP_LIMIT=4 \ YOUTUBE_FLAP_FALLBACK_MODE=matchgop \ YOUTUBE_COPY_RECOVERY=1 \ YOUTUBE_COPY_RECOVERY_SECONDS=60 \ YOUTUBE_X264_PRESET=ultrafast \ YOUTUBE_FIFO_TIMESHIFT=0 \ YOUTUBE_HEALTH_INTERVAL=20 \ TELEMETRY_ENABLED=1 \ YOUTUBE_IDLE_RESET_SECONDS=600 \ STREAM_EVENT_MAX=10000 \ YOUTUBE_OBS_HOLD_SECONDS=900 \ YOUTUBE_SOURCE_RETRY=15 \ YOUTUBE_FORCE_GAP=5 \ YOUTUBE_END_GRACE=40 \ YOUTUBE_REUSE_IDLE=90 \ YOUTUBE_STABLE_SECONDS=25 \ YOUTUBE_FFMPEG_LOGLEVEL=info \ YOUTUBE_SOURCE_READ_TIMEOUT=15 \ YOUTUBE_SOURCE_READ_ATTEMPTS=3 \ YOUTUBE_REATTACH_GRACE_SECONDS=2 \ YOUTUBE_PROGRESS_STALL_SECONDS=60 \ YOUTUBE_KILL_GRACE_SECONDS=10 \ YOUTUBE_PUMP_JOIN_SECONDS=2 \ YOUTUBE_AUTH_PAUSE_SECONDS=90 \ YOUTUBE_SESSION_MAX_SECONDS=21600 \ YOUTUBE_ENHANCED_RTMP=auto \ YOUTUBE_SOURCE_GAP_SUSPECT_SECONDS=8 \ TIKTOK_TT_TARGET_IDC=useast1a \ STORAGE_WAIT_SECONDS=30 \ HLS_START_INDEX=-3 \ PORT=7860 \ PYTHONUNBUFFERED=1 \ YOUTUBE_VIDEO_MODE=original EXPOSE 7860 CMD ["sh", "-c", "exec uvicorn app:app --host 0.0.0.0 --port ${PORT:-7860} --timeout-graceful-shutdown 65 --no-access-log"]