APIサーバー
APIサーバーはEchoとgqlgenで認証済みユーザーの動画メタデータを提供し、POST /api/videos/uploadでmultipartのfileとJSON配列文字列のtagsを受け付けます。タグはPostgreSQLへ保存する前にMEDIA_ENCRYPTION_KEYでAES-GCM暗号化します。動画のHLS(fMP4)成果物も同じ鍵から生成したオブジェクト単位DEKで暗号化して保存します。
再生時は/api/videos/:id/hls/manifest.m3u8と各init.mp4、segment_*.m4sを認証済みのHTTPリクエストへだけ返します。Rangeを受け取った場合は必要な暗号化チャンクだけをS3から取得し、API内で復号して返すため、端末へ鍵を渡さず複数デバイスで再生できます。レスポンスはAccept-RangesとContent-Rangeを付け、シーク時の再取得量を抑えます。
staging objectの一時保存だけはSTAGING_ENCRYPTION_KEYで暗号化し、エンコーダーが入力を取得して削除します。MEDIA_ENCRYPTION_KEYとSTAGING_ENCRYPTION_KEYは分離し、どちらも平文や鍵をRabbitMQへ送信しません。DBアクセスはBob v0.50.0を使用し、sqlcは使用しません。