Masters / Dockerfile
Reooiq96's picture
restore: fleet-standard relay-v2.37-fill-span (identical to other 4 Spaces; guestwatch experiment removed)
812e0d6 verified
Raw History Blame Contribute Delete
2.83 kB
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"]