version: "3.9" # TLC Search + Feed Master - Complete YouTube content indexing & RSS aggregation # Provide ELASTIC_URL / QDRANT_URL (and related) via environment or a .env file. services: # RSS Bridge - Converts YouTube channels to RSS feeds rss-bridge: image: rssbridge/rss-bridge:latest container_name: tlc-rss-bridge hostname: rss-bridge restart: unless-stopped logging: driver: json-file options: max-size: "10m" max-file: "5" ports: - "3001:80" # Feed Master - Aggregates multiple RSS feeds into unified feed feed-master: image: umputun/feed-master:latest container_name: tlc-feed-master hostname: feed-master restart: unless-stopped depends_on: - rss-bridge logging: driver: json-file options: max-size: "10m" max-file: "5" environment: - DEBUG=false - FM_DB=/srv/var/feed-master.bdb - FM_CONF=/srv/etc/fm.yml volumes: - ./feed-master-config:/srv/etc - ./feed-master-config/var:/srv/var - ./feed-master-config/images:/srv/images ports: - "8097:8080" # TLC Search - Flask app for searching YouTube transcripts app: build: context: . dockerfile: Dockerfile ports: - "8080:8080" environment: ELASTIC_URL: ${ELASTIC_URL:?set ELASTIC_URL to your remote Elasticsearch URL} ELASTIC_INDEX: ${ELASTIC_INDEX:-this_little_corner_py} ELASTIC_USERNAME: ${ELASTIC_USERNAME:-} ELASTIC_PASSWORD: ${ELASTIC_PASSWORD:-} ELASTIC_API_KEY: ${ELASTIC_API_KEY:-} ELASTIC_VERIFY_CERTS: ${ELASTIC_VERIFY_CERTS:-0} CHANNELS_PATH: ${CHANNELS_PATH:-/app/python_app/channels.yml} RSS_FEED_URL: ${RSS_FEED_URL:-/rss/youtube-unified} RSS_FEED_UPSTREAM: ${RSS_FEED_UPSTREAM:-http://feed-master:8080} QDRANT_URL: ${QDRANT_URL:?set QDRANT_URL to your remote Qdrant URL} QDRANT_COLLECTION: ${QDRANT_COLLECTION:-tlc-captions-full} QDRANT_VECTOR_NAME: ${QDRANT_VECTOR_NAME:-} QDRANT_VECTOR_SIZE: ${QDRANT_VECTOR_SIZE:-1024} QDRANT_EMBED_MODEL: ${QDRANT_EMBED_MODEL:-BAAI/bge-large-en-v1.5} LOCAL_DATA_DIR: ${LOCAL_DATA_DIR:-/app/data/video_metadata} volumes: - ./channels.yml:/app/python_app/channels.yml:ro - ./data:/app/data:ro