Jika Anda pernah kebingungan bagaimana cara men‑deploy server RTMP di GitHub Actions untuk streaming YouTube, Anda tidak sendirian. Banyak kreator konten, developer, bahkan hobbyist yang ingin memanfaatkan CI/CD modern demi meng‑otomatisasi proses live‑streaming, tapi belum menemukan cara yang sederhana dan dapat diandalkan. Pada artikel ini, saya akan mengajak Anda menelusuri seluruh proses—dari persiapan lingkungan, menulis workflow GitHub Actions, sampai menguji stream ke YouTube—dengan bahasa yang santai, ramah, dan tentunya penuh contoh praktis.

Kenapa harus pakai GitHub Actions? Karena platform ini sudah menyediakan runner berbasis Linux yang siap pakai, bebas biaya untuk proyek publik, dan memungkinkan Anda men‑schedule job, mengelola secrets, serta meng‑integrasikan layanan lain (seperti Google Cloud atau Docker Hub) hanya dengan beberapa baris YAML. Dengan memanfaatkan kekuatan CI/CD, Anda tidak lagi perlu men‑jalankan server fisik 24/7; cukup commit kode, dan GitHub akan men‑deploy RTMP server Anda secara otomatis setiap kali dibutuhkan.

Sebelum masuk ke detail teknis, pastikan Anda sudah memiliki akun GitHub, channel YouTube yang ter‑verifikasi untuk live streaming, serta pemahaman dasar tentang protokol RTMP (Real‑Time Messaging Protocol). Jika Anda belum familiar dengan RTMP, intinya adalah protokol yang mengirimkan video/audio secara real‑time ke server media, yang kemudian meng‑relay ke platform seperti YouTube, Twitch, atau Facebook Live.

Langkah 1: Persiapan Akun dan Repository GitHub

Membuat Akun Github dan Mengelola Repository Pertama Anda | TECHME

Untuk memulai, buat repository baru di GitHub. Anda dapat memberi nama rtmp-youtube-stream atau yang lebih kreatif. Pastikan repository bersifat publik atau private (jika private, Anda perlu men‑setup runner self‑hosted atau menggunakan secrets dengan hati‑hati). Di dalam repository, buat struktur folder sederhana:

  • docker/ – tempat menaruh Dockerfile untuk RTMP server.
  • .github/workflows/ – folder yang menyimpan file workflow GitHub Actions.
  • scripts/ – skrip shell atau Python untuk meng‑generate konfigurasi dinamis.

Selanjutnya, tambahkan Secrets pada repository Anda melalui Settings → Secrets → Actions. Anda akan membutuhkan dua secrets utama:

  • YOUTUBE_STREAM_KEY – kunci stream yang Anda dapatkan dari YouTube Studio → Live → Stream Settings.
  • DOCKERHUB_USERNAME dan DOCKERHUB_TOKEN (opsional) – bila Anda ingin push image ke Docker Hub untuk reuse.

Langkah 2: Membuat Docker Image RTMP Server

docker 搭建nginx-rtmp_docker nginx-rtmp-CSDN博客

Berbagai image RTMP sudah tersedia, misalnya alpine-rtmp atau tiangolo/nginx-rtmp. Pada contoh ini, kita akan membangun image berbasis alpine yang ringan, serta menambahkan konfigurasi Nginx‑RTMP yang men‑forward stream ke endpoint YouTube.

Dockerfile (docker/Dockerfile)

FROM alpine:3.18

# Install Nginx + RTMP module
RUN apk add --no-cache nginx nginx-mod-rtmp

# Copy custom nginx config
COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 1935
CMD ["nginx", "-g", "daemon off;"]

nginx.conf (docker/nginx.conf)

worker_processes  1;
events {
    worker_connections  1024;
}
rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application live {
            live on;
            record off;

            # Push ke YouTube
            push rtmp://a.rtmp.youtube.com/live2/${YOUTUBE_STREAM_KEY};
        }
    }
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
}

Perhatikan bahwa variabel ${YOUTUBE_STREAM_KEY} akan di‑inject oleh GitHub Actions lewat env pada step menjalankan container.

Langkah 3: Menulis Workflow GitHub Actions

File workflow berada di .github/workflows/deploy-rtmp.yml. Workflow ini akan melakukan tiga hal utama: membangun Docker image, menjalankan container secara temporer, dan menguji koneksi RTMP.

Contoh Workflow (deploy-rtmp.yml)

name: Deploy RTMP Server

on:
  push:
    branches: [ main ]
  workflow_dispatch:

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    env:
      YOUTUBE_STREAM_KEY: ${{ secrets.YOUTUBE_STREAM_KEY }}

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Set up QEMU (for multi‑arch)
        uses: docker/setup-qemu-action@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Login to Docker Hub (optional)
        if: secrets.DOCKERHUB_TOKEN != ''
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Build RTMP Docker image
        uses: docker/build-push-action@v4
        with:
          context: ./docker
          file: ./docker/Dockerfile
          tags: ${{ github.repository }}:latest
          push: false   # set true if you want to push ke Docker Hub

      - name: Run RTMP container
        run: |
          docker run -d --name rtmp-server -p 1935:1935 -e YOUTUBE_STREAM_KEY=${YOUTUBE_STREAM_KEY} ${{ github.repository }}:latest
          sleep 10   # beri waktu container start
          # Tes koneksi RTMP dengan ffprobe
          docker exec rtmp-server apk add --no-cache ffmpeg
          ffprobe rtmp://localhost/live/stream -show_error 2>&1 | grep 'Failed' && echo "RTMP test failed!" && exit 1
          echo "RTMP server berjalan dengan baik."

      - name: Stop & Remove container
        if: always()
        run: |
          docker stop rtmp-server
          docker rm rtmp-server

Bagian ffprobe berfungsi sebagai sanity check: jika koneksi ke rtmp://localhost/live/stream berhasil, artinya server sudah siap menerima input dan akan otomatis push ke YouTube berkat konfigurasi push pada nginx.conf.

Langkah 4: Mengirim Stream ke Server RTMP

RTMP Streaming Servers: Understanding the Protocol - VideoSDK

Setelah workflow berhasil, Anda akan memiliki endpoint RTMP publik yang dapat diakses melalui URL GitHub Actions runner, misalnya rtmp://:1935/live. Karena runner bersifat temporary, biasanya Anda akan menjalankan container di dalam step run yang sama dengan streaming. Namun, bila Anda ingin server tetap hidup 24/7, pertimbangkan menggunakan self‑hosted runner di VPS atau layanan cloud.

Untuk mengirim video ke server, gunakan OBS (Open Broadcaster Software) atau aplikasi streaming lain, dan atur Custom RTMP Server dengan URL di atas serta Stream Key apa saja (misalnya stream). OBS akan meng‑push video ke container, dan container otomatis meneruskan ke YouTube. Anda tidak perlu lagi meng‑upload video secara manual atau mengatur encoder di YouTube.

Tips Mengoptimalkan Bitrate

  • Gunakan preset medium pada x264 untuk keseimbangan kualitas dan CPU.
  • Sesuaikan bitrate dengan koneksi internet: 2500 kbps untuk 720p, 4500 kbps untuk 1080p.
  • Jika ingin meningkatkan kualitas tanpa mengorbankan bandwidth, baca Rahasia Optimasi Bitrate YouTube Live Pakai GitHub Actions yang membahas fine‑tuning encoder secara otomatis lewat workflow.

Langkah 5: Men‑schedule Streaming Otomatis dengan GitHub Cron

Schedule GitHub Actions Using CRON Expressions

GitHub Actions mendukung schedule menggunakan sintaks cron. Anda dapat meng‑setup job yang otomatis memulai streaming pada jam tertentu, misalnya setiap hari Senin jam 20:00 WIB. Berikut contoh tambahan pada file deploy-rtmp.yml:

on:
  schedule:
    - cron: '0 13 * * 1'   # 13:00 UTC = 20:00 WIB setiap Senin

Dengan men‑schedule job, Anda tidak perlu menekan tombol “Start Streaming” secara manual. Kombinasikan ini dengan skrip yang mengambil video pre‑recorded atau slide deck, lalu feed ke OBS melalui ffmpeg sehingga streaming menjadi sepenuhnya otomatis. Untuk contoh lebih lengkap, lihat Cara Mengatur Schedule Streaming YouTube Otomatis via GitHub Cron.

Langkah 6: Monitoring dan Debugging

Apa Itu Debugging dan Mengapa Ini Penting Bagi Developer?

Setelah semua berjalan, penting untuk memantau health server dan log RTMP. Anda dapat men‑export log Nginx ke GitHub Actions artefak dengan menambahkan step berikut:

- name: Collect Nginx logs
  if: failure()
  run: |
    docker logs rtmp-server > nginx.log
    tar -czf logs.tar.gz nginx.log
  uses: actions/upload-artifact@v3
  with:
    name: rtmp-logs
    path: logs.tar.gz

Jika terjadi kegagalan (misalnya YouTube menolak stream key), log ini akan membantu Anda mengidentifikasi masalah dengan cepat. Selain itu, Anda dapat men‑integrasikan alert ke Slack atau Discord menggunakan webhook untuk notifikasi real‑time.

Langkah 7: Menambahkan Fitur Lanjutan (Opsional)

Berikut beberapa ide yang dapat Anda tambahkan ke pipeline:

  • Transcoding otomatis: gunakan ffmpeg di dalam container untuk mengubah resolusi atau bitrate sesuai kebutuhan penonton. Lihat artikel Kenapa Perlu CI Pipeline untuk Transcoding? untuk pemahaman lebih dalam.
  • Integrasi Chat Bot: sambungkan YouTube Live Chat ke bot yang dijalankan di GitHub Actions, sehingga komentar dapat diproses secara otomatis. Panduan lengkap ada di Rahasia Kelola Komentar YouTube Live Pakai Bot di GitHub.
  • Multi‑platform streaming: selain YouTube, tambahkan endpoint Twitch atau Facebook Live di nginx.conf untuk simulcast.

Semua fitur tambahan ini tetap dapat dikelola melalui file YAML yang sama, sehingga Anda tidak perlu men‑setup server terpisah atau menulis skrip rumit di luar repo.

Dengan mengikuti langkah‑langkah di atas, Anda kini memiliki sistem streaming yang ter‑otomatisasi penuh, dapat dikelola melalui version control, dan mudah di‑scale. Kelebihan utama adalah Anda tidak lagi bergantung pada mesin pribadi yang harus tetap menyala 24 jam; cukup commit perubahan, dan GitHub akan men‑deploy server RTMP Anda kapanpun dibutuhkan. Selamat mencoba, dan semoga streaming Anda makin profesional tanpa harus mengeluarkan biaya besar!