* feat: show trash for soft deleted transcripts and hard delete option * fix: test fixtures * docs: aws new permissions
5.5 KiB
sidebar_position, title
| sidebar_position | title |
|---|---|
| 6 | Daily.co Setup |
Daily.co Setup
This page covers Daily.co video platform setup for live meeting rooms. For the complete deployment guide, see Deployment Guide.
Daily.co enables live video meetings with automatic recording and transcription.
What You'll Set Up
User joins meeting → Daily.co video room → Recording to S3 → [Webhook] → Reflector transcribes
Prerequisites
- Daily.co account - Free tier at https://dashboard.daily.co
- AWS account - For S3 storage
- Reflector deployed - Complete steps from Deployment Guide
Create Daily.co Account
- Visit https://dashboard.daily.co and sign up
- Verify your email
- Note your subdomain (e.g.,
yourname.daily.co→ subdomain isyourname)
Get Daily.co API Key
- In Daily.co dashboard, go to Developers
- Click API Keys
- Click Create API Key
- Copy the key (starts with a long string)
Save this for later.
Create AWS S3 Bucket
Daily.co needs somewhere to store recordings before Reflector processes them.
# Choose a unique bucket name
BUCKET_NAME="reflector-dailyco-yourname" # -yourname is not a requirement, you can name the bucket as you wish
AWS_REGION="us-east-1"
# Create bucket
aws s3 mb s3://$BUCKET_NAME --region $AWS_REGION
# Enable versioning (required)
aws s3api put-bucket-versioning \
--bucket $BUCKET_NAME \
--versioning-configuration Status=Enabled
Create IAM Role for Daily.co
Daily.co needs permission to write recordings to your S3 bucket.
Follow the guide https://docs.daily.co/guides/products/live-streaming-recording/storing-recordings-in-a-custom-s3-bucket
Save the role ARN - you'll need it soon.
It looks like: arn:aws:iam::123456789012:role/DailyCo
Shortly, you'll need to set up a role and give this role your s3 bucket access
No additional setup is required from Daily.co settings website side: the app code takes care of letting Daily know where to save the recordings.
Configure Reflector
Location: Reflector server
Add to server/.env:
# Daily.co Configuration
DEFAULT_VIDEO_PLATFORM=daily
DAILY_API_KEY=<your-api-key-from-daily-setup>
DAILY_SUBDOMAIN=<your-subdomain-from-daily-setup>
# S3 Storage for Daily.co recordings
DAILYCO_STORAGE_AWS_BUCKET_NAME=<your-bucket-from-daily-setup>
DAILYCO_STORAGE_AWS_REGION=us-east-1
DAILYCO_STORAGE_AWS_ROLE_ARN=<your-role-arn-from-daily-setup>
# Worker credentials for reading/deleting recordings from Daily's S3 bucket.
# Required when transcript storage uses a different bucket or credentials
# (e.g., selfhosted with Garage or a separate S3 account).
DAILYCO_STORAGE_AWS_ACCESS_KEY_ID=<your-aws-access-key>
DAILYCO_STORAGE_AWS_SECRET_ACCESS_KEY=<your-aws-secret-key>
# Transcript storage (should already be configured from main setup)
# TRANSCRIPT_STORAGE_BACKEND=aws
# TRANSCRIPT_STORAGE_AWS_ACCESS_KEY_ID=<your-key>
# TRANSCRIPT_STORAGE_AWS_SECRET_ACCESS_KEY=<your-secret>
# TRANSCRIPT_STORAGE_AWS_BUCKET_NAME=<your-bucket-name>
# TRANSCRIPT_STORAGE_AWS_REGION=<your-bucket-region>
:::info Two separate credential sets for Daily.co
ROLE_ARN— Used by Daily's API to write recordings into your S3 bucket (configured via Daily dashboard).ACCESS_KEY_ID/SECRET_ACCESS_KEY— Used by Reflector workers to read recordings for transcription and delete them on consent denial or permanent transcript deletion.
Required IAM permissions for the worker key on the Daily recordings bucket:
s3:GetObject— Download recording files for processings3:DeleteObject— Remove files on consent denial, trash destroy, or data retention cleanups3:ListBucket— Scan for recordings needing reprocessing
If the worker keys are not set, Reflector falls back to the transcript storage master key, which then needs cross-bucket access to the Daily bucket. :::
Restart Services
After changing .env files, reload with up -d:
sudo docker compose -f docker-compose.prod.yml up -d server worker
Note: docker compose up -d detects env changes and recreates containers automatically.
Test Live Room
- Visit your Reflector frontend:
https://app.example.com - Go to Rooms
- Click Create Room
- Select Daily as the platform
- Allow camera/microphone access
- You should see Daily.co video interface
- Speak for 10-20 seconds
- Leave the meeting
- Recording should appear in Transcripts within 5 minutes (if webhooks aren't set up yet, see Webhook Configuration below)
Troubleshooting
Recording doesn't appear in S3
- Check Daily.co dashboard → Logs for errors
- Verify IAM role trust policy has correct Daily.co account ID and your Daily.co subdomain
- Verify that the bucket has
Recording in S3 but not transcribed
- Check webhook is configured (Reflector should auto-create it)
- Check worker logs:
docker compose -f docker-compose.prod.yml logs worker --tail 50 - Verify
DAILYCO_STORAGE_AWS_*vars inserver/.env
"Access Denied" when Daily.co tries to write to S3
- Double-check IAM role ARN in Daily.co settings
- Verify bucket name matches exactly
- Check IAM policy has
s3:PutObjectpermission
Webhook Configuration [optional]
manage_daily_webhook.py script guides you through creating a webhook for Daily recordings.
The webhook isn't required - polling mechanism is the default and performed automatically.
This guide won't go deep into webhook setup.