DSR配信システム - ライブストリーミングとタイムテーブル管理のための全機能Webアプリケーション。
📖 使用ガイド(USAGE.md) - 本番環境での起動方法とOBS配信設定はこちら
- ライブストリーミング: RTMP経由でのライブストリーム受信とHLS配信
- Webインターフェース: リアルタイムでのストリーム視聴とタイムテーブル管理
- タイムテーブル管理: 予約の作成・削除・閲覧(15分単位、最大1時間枠)
- 自動ステータス表示: 現在のDJ名とスケジュールの自動更新
- パスコード認証: 4桁パスコードによる予約削除保護
- フロントエンド: React 19 + TypeScript + Vite
- バックエンド: Go + Chi v5
- ストリーミング: MediaMTX (RTMP → HLS変換)
- データベース: PostgreSQL 18
- リバースプロキシ: Nginx
- API: OpenAPI 3.0によるスキーマファースト開発
- コンテナ化: Docker + Docker Compose
- Docker EngineとDocker Compose
- Node.js 20.19以上または22.12以上(フロントエンドを個別に開発する場合)
- Go 1.25.5以上(バックエンドを個別に開発する場合)
- PostgreSQL 18(データベースを個別に起動する場合)
# リポジトリのクローン
git clone https://github.com/outductor/stream-system-backend.git
cd stream-system-backend
# 環境変数の作成と編集
cp .env.example .env
# 開発環境の起動
docker compose up -d --build
# ログの確認
docker compose logs -f- nginx: リバースプロキシ(ポート80)
- frontend: React Webアプリケーション
- backend: Go API サーバー
- mediamtx: RTMPストリーミングサーバー(ポート19350)
- postgres: データベース
Compose環境では、リポジトリ直下の.envに次の値を設定します。
日時はEVENT_TIMEZONEのローカル時刻として解釈されます。
PRODUCTION_DOMAIN=http://localhost
DB_PASSWORD=change-this-password
EVENT_START_TIME=2026-08-28 00:00:00
EVENT_END_TIME=2026-08-30 23:59:59
EVENT_TIMEZONE=Asia/TokyoVITE_API_BASE_URLとVITE_HLS_ENDPOINTはComposeビルド時にPRODUCTION_DOMAINから生成されます。
バックエンドを個別に起動する場合は、DB_HOST、DB_PORT、DB_NAME、DB_USER、DB_PASSWORD、DB_SSLMODE、SERVER_HOST、SERVER_PORT、LOG_LEVELも設定できます。
cd frontend
npm install
npm run dev # http://localhost:5173cd backend
go mod download
# APIコードの生成
make generate-api
# ローカル実行(PostgreSQLが必要)
make runAPIの詳細仕様は api/openapi.yaml を参照してください。
GET /api/v1/stream/status- 配信状態とスケジュール情報GET /api/v1/reservations- 予約一覧の取得POST /api/v1/reservations- 新規予約の作成DELETE /api/v1/reservations/{reservationId}- 予約の削除(パスコード認証)GET /api/v1/available-slots- 指定時間範囲内の利用可能時間枠GET /api/v1/event-config- イベント期間とタイムゾーンの取得GET /api/v1/ws/viewer- 視聴者数更新用WebSocket
# ヘルスチェック
curl http://localhost/health
# ストリーム状態確認
curl http://localhost/api/v1/stream/status | jq .
# 予約一覧取得
curl http://localhost/api/v1/reservations | jq .
# 予約作成(イベント期間内の未来時刻へ置き換えてください)
curl -X POST http://localhost/api/v1/reservations \
-H "Content-Type: application/json" \
-d '{
"djName": "DJ テスト 🎵",
"startTime": "2026-08-28T10:00:00+09:00",
"endTime": "2026-08-28T11:00:00+09:00",
"passcode": "1234"
}' | jq .
# 利用可能時間枠確認(72時間以内)
curl "http://localhost/api/v1/available-slots?startTime=2026-08-28T00:00:00%2B09:00&endTime=2026-08-29T00:00:00%2B09:00" | jq .
# 予約削除
curl -X DELETE http://localhost/api/v1/reservations/{reservation-id} \
-H "Content-Type: application/json" \
-d '{"passcode": "1234"}'# ユニットテスト(バックエンド)
(cd backend && go test ./...)
# フロントエンドの型チェック、ビルド、Lint
(cd frontend && npm run build && npm run lint)stream-system-backend/
├── api/ # OpenAPI仕様
│ └── openapi.yaml # API定義
├── backend/ # Goバックエンド
│ ├── cmd/server/ # メインアプリケーション
│ ├── internal/ # 内部パッケージ
│ │ ├── api/ # APIハンドラー・生成コード
│ │ ├── config/ # 設定管理
│ │ └── db/ # データベース層
│ ├── db/ # データベーススキーマ
│ └── Makefile # ビルドタスク
├── frontend/ # React Webアプリ
│ ├── src/
│ │ ├── components/ # UIコンポーネント
│ │ ├── pages/ # ページコンポーネント
│ │ ├── api/ # APIクライアント
│ │ ├── hooks/ # Reactフック
│ │ └── types/ # TypeScript型定義
│ └── package.json
├── mediamtx/ # ストリーミングサーバー設定
├── nginx/ # リバースプロキシ設定
├── compose.yaml # Docker Compose設定
└── media/ # 生成されるメディアファイル
cd backend
# 依存関係のインストール
go mod download
# APIコード再生成
make generate-api
# ビルド
make build
# ローカル実行
make runcd frontend
# 依存関係のインストール
npm install
# 開発サーバー起動
npm run dev
# プロダクションビルド
npm run build
# リント実行
npm run lintデフォルトポート使用状況:
- HTTP(Nginx): 80
- RTMP(MediaMTX): 19350
ポートが使用中の場合、compose.yamlのportsセクションを編集してください。
# 既存コンテナの停止
docker compose down
# イメージの再ビルド
docker compose build --no-cache
# 再起動
docker compose up -dデータベースを含む永続データも破棄する場合に限り、docker compose down -vを使用してください。
.github/workflows/には次のワークフローが定義されています。
pr-build-check.yaml: プルリクエスト時のコード生成同期、Lint、型チェック、Compose統合テスト
# バックエンドのリント
(cd backend && golangci-lint run)
# フロントエンドのLint、型チェック、プロダクションビルド
(cd frontend && npm run lint && npm run build)- フィーチャーブランチを作成
- 変更をコミット
- プルリクエストを作成
- レビューを受ける
- マージ
feat: 新機能の追加
fix: バグ修正
docs: ドキュメントのみの変更
style: コードの意味に影響しない変更
refactor: バグ修正や機能追加を含まないコード変更
test: テストの追加や修正
chore: ビルドプロセスやツールの変更
このプロジェクトはMIT Licenseの下で公開されています。