{"id":19144212,"url":"https://github.com/bgelov/xiu-compose","last_synced_at":"2026-04-19T07:35:26.976Z","repository":{"id":179280571,"uuid":"657193794","full_name":"bgelov/xiu-compose","owner":"bgelov","description":"Реализация rtmp-кластера на базе https://github.com/harlanc/xiu.git стрим-сервера в Docker Compose","archived":false,"fork":false,"pushed_at":"2023-07-06T22:27:37.000Z","size":1328,"stargazers_count":1,"open_issues_count":2,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-02-22T19:31:49.906Z","etag":null,"topics":["docker","docker-compose","harlanc","rtmp","rtmp-cluster","rtmp-server","stream","streaming","xiu","xiu-cluster","xiu-docker"],"latest_commit_sha":null,"homepage":"","language":"Dockerfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bgelov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-06-22T14:16:15.000Z","updated_at":"2024-01-30T07:12:59.000Z","dependencies_parsed_at":null,"dependency_job_id":"19ca4752-6752-4891-9036-575d8ea9b000","html_url":"https://github.com/bgelov/xiu-compose","commit_stats":null,"previous_names":["bgelov/xiu-compose"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bgelov/xiu-compose","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bgelov%2Fxiu-compose","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bgelov%2Fxiu-compose/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bgelov%2Fxiu-compose/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bgelov%2Fxiu-compose/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bgelov","download_url":"https://codeload.github.com/bgelov/xiu-compose/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bgelov%2Fxiu-compose/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31999169,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","docker-compose","harlanc","rtmp","rtmp-cluster","rtmp-server","stream","streaming","xiu","xiu-cluster","xiu-docker"],"created_at":"2024-11-09T07:34:08.879Z","updated_at":"2026-04-19T07:35:26.928Z","avatar_url":"https://github.com/bgelov.png","language":"Dockerfile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Реализация rtmp-кластера на базе https://github.com/harlanc/xiu.git стрим-сервера из 3 инстансов\n\nРеализация xiu кластера для проверки функционала в локальной среде, используя docker-compose. Просмотр потока в httpflv и hls с каждого члена кластера и наличие rtmp потока у всех членов кластера\n\n- Сборка и запуск в несколько стадий. В качестве раннера используется alpine.\n- Для запуска по умолчанию используется стандартный toml конфиг application/xiu/src/config/config_rtmp.toml.\n- Для подачи и просмотра потоков используется ffmpeg и ffplay. Семплы из https://sample-videos.com/\n\n# Описание решения\n## Сборка образа\nСогласно требованиям, необходимо использовать multi-stage, собирать приложение в одном контейнере и копировать исполняемые файлы в другой контейнер с Alpine.\nПроект xiu написан на Rust. Следовательно, для сборки оптимально использовать образ из [официального репозитория Rust](https://hub.docker.com/_/rust). \n\nСоздаём рабочий каталог и клонируем в него проект xiu:\n```\nmkdir xiu-image \u0026\u0026 cd xiu-image\ngit clone https://github.com/harlanc/xiu.git \n```\n\nПишем Dockerfile.\n```\nvi Dockerfile\n```\n\n- Так как runner у нас Alpine, добавляем дополнительно musl-dev.\n- Не забываем о том, что нам необходимо добавить toml конфиг для запуска по-умолчанию.\n- По дефолту запускаем `xiu -c \u003cпуть-до конфига\u003e`.\n- По best practice указываем версии образов и не плодим RUN.\n\n```\nFROM rust:alpine3.18 as builder\nCOPY ./ ./\nWORKDIR /xiu/application/xiu\nRUN apk add --no-cache musl-dev openssl-dev \u0026\u0026 \\\n    rustup target add x86_64-unknown-linux-musl \u0026\u0026 \\\n    cargo build --release --target x86_64-unknown-linux-musl\n\t\nFROM alpine:3.18 as runner\nCOPY --from=builder /xiu/target/x86_64-unknown-linux-musl/release/xiu /usr/local/bin/xiu\nCOPY --from=builder /xiu/application/xiu/src/config/config_rtmp.toml /etc/xiu/config_rtmp.toml\nCMD [\"xiu\", \"-c\", \"/etc/xiu/config_rtmp.toml\"]\n\n```\n\nСобираем образ:\n```\ndocker image build -t bgelov/xiu:1.0.0 .\n```\n\n### Тестирование образа\n\nПробуем запустить контейнер:\n```\ndocker run -d -p 1935:1935 --name xiu bgelov/xiu:1.0.0\n```\n\nПроверяем, что контейнер запущен и смотрим на логи:\n```\ndocker ps\ndocker logs xiu\n```\n\nВсё ок:\n```\ndocker logs xiu\n[2023-06-22T20:11:41Z INFO  rtmp::rtmp] Rtmp server listening on tcp://0.0.0.0:1935\n[2023-06-22T20:11:41Z INFO  xiu::api] Http api server listening on http://:8000\n```\n\nТестируем работу с использованием ffmpeg и ffplay. [Скачиваем](https://ffmpeg.org/download.html) приложения. [Скачиваем](https://sample-videos.com/) сэмпл видео.\nЗапускаем ffmpeg, давая ему на вход скачанное видео (big_buck_bunny_720p_30mb.mp4):\n```\nffmpeg -re -stream_loop -1 -i big_buck_bunny_720p_30mb.mp4 -c:a copy -c:v copy -f flv -flvflags no_duration_filesize rtmp://127.0.0.1:1935/live/test\n```\nДля просмотра запускаем ffplay:\n```\nffplay -i rtmp://localhost:1935/live/test\n```\n\nУспех! Мы видим мультики.\n\n### Публикация образа\nПосле успешного теста публикуем образ в registry.\n\nФормируем имя образа в формате `\u003ctimestamp\u003e-\u003cmd5 хеш от Dockerfile\u003e, версия 1.0.0`:\n```\nIMAGE_NAME=\"$(date --utc -d \"2023-06-21 11:15\" +%s)-$(md5sum Dockerfile | awk '{print $1}'):1.0.0\"\necho $IMAGE_NAME\n```\nТегаем образ необходимым для публикаци в registry именем и публикуем:\n```\ndocker tag bgelov/xiu:1.0.0 bgelov/$IMAGE_NAME\ndocker push bgelov/$IMAGE_NAME\n```\n\nСсылка на образ: https://hub.docker.com/r/bgelov/1687346100-977d03e7f0746077d90baa216bbf61c2\n\n\n## Реализуем кластер\nНеобходимо реализовать rtmp-кластер из 3 инстансов, используя docker compose.\nСогласно [документации](https://github.com/harlanc/xiu), в xiu можно реализовать кластер путём push на остальные ноды или pull с другой ноды.\nВыбираем вариант с pull. Это значит, что у нас будет 2 типа конфигурации xiu, для мастер ноды и для обычных нод.\n\nСоздаём рабочий каталог:\n```\nmkdir xiu-compose \u0026\u0026 cd xiu-compose\n```\n\nПишем docker compose файл `vi docker-compose.yml`. Для упрощения файла, вынесем название образа в переменную:\n```\nservices:\n  xiu-server-1:\n    container_name: xiu-server-1\n    image: ${XIU_IMAGE}\n    ports:\n      - 1935:1935\n      - 8081:8081\n      - 8080:8080\n    volumes:\n      - ./conf/master/config_rtmp.toml:/etc/xiu/config_rtmp.toml\n\n  xiu-server-2:\n    container_name: xiu-server-2\n    image: ${XIU_IMAGE}\n    ports:\n      - 1936:1935\n      - 8181:8081\n      - 8180:8080\n    volumes:\n      - ./conf/node/config_rtmp.toml:/etc/xiu/config_rtmp.toml\n\n  xiu-server-3:\n    container_name: xiu-server-3\n    image: ${XIU_IMAGE}\n    ports:\n      - 1937:1935\n      - 8281:8081\n      - 8280:8080\n    volumes:\n      - ./conf/node/config_rtmp.toml:/etc/xiu/config_rtmp.toml\n```\n\nРядом с docker-compose.yml создаём файл `vi .env` и добавим в него переменную `XIU_IMAGE`:\n```\nXIU_IMAGE=bgelov/1687346100-977d03e7f0746077d90baa216bbf61c2:1.0.0\n```\n\nРядом с docker-compose.yml так же создадим структуру с конфигурациями xiu для мастер ноды и для обычной ноды. Так как нам нужны потоки rtmp, httpflv и hls, за пример возьмём конфиг `application\\xiu\\src\\config\\config_rtmp_httpflv_hls.toml`.\n\n\nПишем конфигурацию для мастер ноды по пути `conf/master/config_rtmp.toml` с добавление блока `[[rtmp.push]]`:\n```\n#live server configurations\n#######################################\n#     RTMP configurations(cluster)    #\n#######################################\n[rtmp]\nenabled = true\nport = 1935\n\n#######################################\n#  push streams to other server node  #\n#######################################\n[[rtmp.push]]\nenabled = true\naddress = \"xiu-server-2\"\nport = 1935\n[[rtmp.push]]\nenabled = true\naddress = \"xiu-server-3\"\nport = 1935\n\n\n######################################\n#    HLS configurations              #\n######################################\n[hls]\nenabled = true\nport = 8080\n\n\n########################################\n# HTTPFLV configurations               #\n########################################\n[httpflv]\nenabled = true\nport = 8081\n\n\n#######################################\n#   LOG configurations                #\n#######################################\n[log]\nlevel = \"info\"\n\n```\n\nПишем конфигурацию для обычных нод `conf/node/config_rtmp.toml`\n```\n#live server configurations\n#######################################\n#   RTMP configurations(stand-alone)  #\n#######################################\n[rtmp]\nenabled = true\nport = 1935\n\n\n######################################\n#    HLS configurations              #\n######################################\n[hls]\nenabled = true\nport = 8080\n\n\n########################################\n# HTTPFLV configurations               #\n########################################\n[httpflv]\nenabled = true\nport = 8081\n\n\n#######################################\n#   LOG configurations                #\n#######################################\n[log]\nlevel = \"info\"\n\n```\n\nЗапускаем кластер:\n```\ndocker compose up -d\n```\n\n### Тестируем работоспособность кластера\nУспешным результатом считаем:\n- Наличие rtmp потока у всех членов кластера\n- Просмотр потока в httpflv и hls с каждого члена кластера\n\nЗапускаем ffmpeg на мастер ноду rtmp://127.0.0.1:1935, давая на вход тестовое видео (big_buck_bunny_720p_30mb.mp4):\n```\nffmpeg -re -stream_loop -1 -i big_buck_bunny_720p_30mb.mp4 -c:a copy -c:v copy -f flv -flvflags no_duration_filesize rtmp://127.0.0.1:1935/live/test\n```\n\nДля просмотра rtmp потока запускаем ffplay на каждую ноду:\n```\nffplay -i rtmp://localhost:1935/live/test\nffplay -i rtmp://localhost:1936/live/test\nffplay -i rtmp://localhost:1937/live/test\n```\n\nДля просмотра потока в httpflv и hls запускаем:\n```\n# xiu-server-1\nffplay -i http://localhost:8081/live/test.flv\nffplay -i http://localhost:8080/live/test/test.m3u8\n\n# xiu-server-2\nffplay -i http://localhost:8181/live/test.flv\nffplay -i http://localhost:8180/live/test/test.m3u8\n\n# xiu-server-3\nffplay -i http://localhost:8281/live/test.flv\nffplay -i http://localhost:8280/live/test/test.m3u8\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbgelov%2Fxiu-compose","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbgelov%2Fxiu-compose","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbgelov%2Fxiu-compose/lists"}