MiroTalk SFU: Recording not possible?
-
It seems like 2 separate updated packages have been released for this.
Just came across the 2nd one and updated the app again.- The
recfolder is now available in/app/data/ - All recordings are still being saved on the local device only. No server-side recording. No S3 recording.
Hello @shrey
I have just updated my Mirotalk SFU app and now the recordings are stored inside the Mirotalk SFU app in/app/data/rec/.
Please share your/app/data/envfile.
With the updated app and a fresh installed app the recording works.
In a meeting I can do:


ls -lah /app/data/rec/ total 5.2M drwxr-xr-x 2 cloudron cloudron 4.0K Nov 15 09:46 . drwxr-xr-x 3 cloudron cloudron 4.0K Nov 15 09:44 .. -rw-r--r-- 1 cloudron cloudron 5.2M Nov 15 09:46 Rec_09598YoungSpid_2025_11_15_10_45_32_e0005370-10dd-4487-a68e-cff4d94f274d.webm - The
-
Hi @james , thanks for the screenshots. I can now see that there's a "Save on server" option in the UI, and it's working for me as well.
Now, just S3 is left to work.
Myenvfile -># Recording RECORDING_ENABLED=true # Enable recording functionality (true|false) RECORDING_UPLOAD_TO_S3=false # Upload recording to AWS S3 bucket [true/false] # AWS S3 Configuration AWS_S3_ENABLED=true # Enable AWS S3 storage (true|false) AWS_S3_BUCKET_NAME=<bucket-name> # Name of your S3 bucket (must exist) AWS_ACCESS_KEY_ID=<key-id> # AWS Access Key ID (leave empty for IAM roles) AWS_SECRET_ACCESS_KEY=<key-secret> # AWS Secret Access Key (leave empty for IAM roles) AWS_REGION=<region> # AWS region (e.g., us-east-2, eu-west-2) AWS_S3_ENDPOINT=https://<region>.digitaloceanspaces.comNote: Although i didn't find the "AWS_S3_ENDPOINT" key in the
envtemplate, i configured it because it seems to work with most S3 client libraries, and is a necessity to be able to connect to S3 spaces other than AWS. -
Hello @shrey
The library used in MiroTalk SFU for AWS/S3 is aws-sdk/client-s3.
It seems MiroTalk SFU does not have the option to configure the endpoint.
From the MiroTalk SFU Code handling the configuration:aws: { enabled: process.env.AWS_S3_ENABLED === 'true', accessKeyId: process.env.AWS_ACCESS_KEY_ID || 'your-access-key-id', secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY || 'your-secret-access-key', region: process.env.AWS_REGION || 'us-east-2', bucket: process.env.AWS_S3_BUCKET || 'mirotalk', },Also in the
server.jswhere theS3Clientis initialized, the endpoint is never configured, thus using the default, resolving the endpoint from theAWS_REGION.
https://github.com/miroslavpejic85/mirotalksfu/blob/b2a41e597610524b259097d2e1b52674dda631c0/app/src/Server.js#L297-L303const s3Client = new S3Client({ region: config?.integrations?.aws?.region, // Set your AWS region credentials: { accessKeyId: config?.integrations?.aws?.accessKeyId, secretAccessKey: config?.integrations?.aws?.secretAccessKey, }, });So we need to ask @mirotalk-57bab571 to add the option to configure the endpoint as well.
Adding to that, when a non AWS endpoint is used, the optionforcePathStyle: truemight also be needed for the best compatibility with e.g. MinIO and most S3-compatible systems.
@mirotalk-57bab571
It is the weekend, please don't feel pressured or forced to work on the weekend.
Would it be possible to add the option to configure theS3Clientendpointconfig andS3ClientforcePathStyleconfig? -
Hello @shrey
The library used in MiroTalk SFU for AWS/S3 is aws-sdk/client-s3.
It seems MiroTalk SFU does not have the option to configure the endpoint.
From the MiroTalk SFU Code handling the configuration:aws: { enabled: process.env.AWS_S3_ENABLED === 'true', accessKeyId: process.env.AWS_ACCESS_KEY_ID || 'your-access-key-id', secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY || 'your-secret-access-key', region: process.env.AWS_REGION || 'us-east-2', bucket: process.env.AWS_S3_BUCKET || 'mirotalk', },Also in the
server.jswhere theS3Clientis initialized, the endpoint is never configured, thus using the default, resolving the endpoint from theAWS_REGION.
https://github.com/miroslavpejic85/mirotalksfu/blob/b2a41e597610524b259097d2e1b52674dda631c0/app/src/Server.js#L297-L303const s3Client = new S3Client({ region: config?.integrations?.aws?.region, // Set your AWS region credentials: { accessKeyId: config?.integrations?.aws?.accessKeyId, secretAccessKey: config?.integrations?.aws?.secretAccessKey, }, });So we need to ask @mirotalk-57bab571 to add the option to configure the endpoint as well.
Adding to that, when a non AWS endpoint is used, the optionforcePathStyle: truemight also be needed for the best compatibility with e.g. MinIO and most S3-compatible systems.
@mirotalk-57bab571
It is the weekend, please don't feel pressured or forced to work on the weekend.
Would it be possible to add the option to configure theS3Clientendpointconfig andS3ClientforcePathStyleconfig?@james said in MiroTalk SFU: Recording not possible?:
Would it be possible to add the option to configure the S3Client endpoint config and S3Client forcePathStyle config?
So the goal is to avoid hard-coding support only for AWS S3.
To extend the configuration so it also supports any S3-compatible storage (MinIO, Wasabi, DigitalOcean Spaces, etc.), i need to add the following to the.envfile:AWS_S3_ENDPOINT= # e.g., http://localhost:9000 for MinIO AWS_S3_FORCE_PATH_STYLE=false # Set to true for S3-compatible servicesThen expose these values in
config.js:aws: { // ... endpoint: process.env.AWS_S3_ENDPOINT || '', forcePathStyle: process.env.AWS_S3_FORCE_PATH_STYLE === 'true', },Finally, update the S3 client configuration in
Server.js:const s3Client = new S3Client({ // ... endpoint: config?.integrations?.aws?.endpoint || undefined, forcePathStyle: config?.integrations?.aws?.forcePathStyle === true, });With this setup, the application continues to work with AWS S3 as it currently does, but can also switch to any S3-compatible service simply by adjusting environment variables and no additional code changes required.
Sounds good to me! @James just confirm.
-
J joseph marked this topic as a regular topic
-
I am running the following env file:
All config options at https://github.com/miroslavpejic85/mirotalksfu/blob/main/.env.template PRESENTERS=admin@cloudron.local EMAIL_SEND_TO=admin@cloudron.local STATS_ENABLED=false RECORDING_UPLOAD_TO_S3=true AWS_S3_ENABLED=true AWS_S3_ENDPOINT=https://minio-api.cloudron.dev AWS_S3_BUCKET_NAME=sfu AWS_S3_FORCE_PATH_STYLE=true AWS_ACCESS_KEY_ID=LJQVOTFR3DZDG1QPOL0Y AWS_SECRET_ACCESS_KEY=j6w8j73VF8NE9wzsi4aupJICTrn45I0MKIoYUCk9This access key and secret have full access to all buckets.
Buckets arebackupandsfu.
Thebackupbucket I used for testing for Cloudron Backups, which works.But with MiroTalk SFU there seems to be an issue:
Nov 16 16:43:28 [11/16/2025, 15:43:28:847] [Server] [Upload] Saved Rec_13172BasicZebra_2025_11_16_16_43_23_f6ee8290-dcb8-44ec-b30e-dab24b4bae36.webm (0.07 MB) in 0.00s '' Nov 16 16:43:30 [11/16/2025, 15:43:30:316] [Server] Rec Finalization error 'The specified bucket does not exist'Without the
AWS_S3_FORCE_PATH_STYLEvariable I get:Nov 16 16:44:56 [11/16/2025, 15:44:56:198] [Server] Rec Finalization error 'getaddrinfo ENOTFOUND mirotalk.minio-api.cloudron.dev'Which would suggest that
AWS_S3_BUCKET_NAMEwhich I set tosfuis getting ignored and defaultmirotalkis used?
So I add theAWS_S3_FORCE_PATH_STYLE=trueagain and create a bucket namedmirotalk.
Confirmed working.Nov 16 16:49:29 [11/16/2025, 15:49:29:552] [Server] [Upload] Saved Rec_13172BasicZebra_2025_11_16_16_49_23_3e9ab0ce-5148-43b3-a827-e524537fd01b.webm (0.95 MB) in 0.01s '' Nov 16 16:49:29 [11/16/2025, 15:49:29:702] [Server] [Upload] Saved Rec_13172BasicZebra_2025_11_16_16_49_23_3e9ab0ce-5148-43b3-a827-e524537fd01b.webm (0.20 MB) in 0.00s '' Nov 16 16:49:30 [11/16/2025, 15:49:30:586] [Server] [Rec Finalization] done Rec_13172BasicZebra_2025_11_16_16_49_23_3e9ab0ce-5148-43b3-a827-e524537fd01b.webm in 0.32s { Nov 16 16:49:30 success: true, Nov 16 16:49:30 fileName: 'Rec_13172BasicZebra_2025_11_16_16_49_23_3e9ab0ce-5148-43b3-a827-e524537fd01b.webm', Nov 16 16:49:30 key: 'recordings/13172BasicZebra/Rec_13172BasicZebra_2025_11_16_16_49_23_3e9ab0ce-5148-43b3-a827-e524537fd01b.webm' Nov 16 16:49:30 } Nov 16 16:49:30 [11/16/2025, 15:49:30:587] [Server] [Upload] File /app/data/rec/Rec_13172BasicZebra_2025_11_16_16_49_23_3e9ab0ce-5148-43b3-a827-e524537fd01b.webm removed from local after S3 upload ''/app/data/envis:All config options at https://github.com/miroslavpejic85/mirotalksfu/blob/main/.env.template PRESENTERS=admin@cloudron.local EMAIL_SEND_TO=admin@cloudron.local STATS_ENABLED=false RECORDING_UPLOAD_TO_S3=true AWS_S3_ENABLED=true AWS_S3_ENDPOINT=https://minio-api.cloudron.dev AWS_S3_BUCKET_NAME=sfu AWS_S3_FORCE_PATH_STYLE=true AWS_ACCESS_KEY_ID=LJQVOTFR3DZDG1QPOL0Y AWS_SECRET_ACCESS_KEY=j6w8j73VF8NE9wzsi4aupJICTrn45I0MKIoYUCk9And I created a bucket named
mirotalk.
-
I found the offending lines:
bucket: process.env.AWS_S3_BUCKET || 'mirotalk',const bucket = config?.integrations?.aws?.bucket;This would mean the
envwould beAWS_S3_BUCKETand notAWS_S3_BUCKET_NAME.
Confirmed with thisenvAll config options at https://github.com/miroslavpejic85/mirotalksfu/blob/main/.env.template PRESENTERS=admin@cloudron.local EMAIL_SEND_TO=admin@cloudron.local STATS_ENABLED=false RECORDING_UPLOAD_TO_S3=true AWS_S3_ENABLED=true AWS_S3_ENDPOINT=https://minio-api.cloudron.dev AWS_S3_BUCKET_NAME=sfu AWS_S3_BUCKET=sfu AWS_S3_FORCE_PATH_STYLE=true AWS_ACCESS_KEY_ID=LJQVOTFR3DZDG1QPOL0Y AWS_SECRET_ACCESS_KEY=j6w8j73VF8NE9wzsi4aupJICTrn45I0MKIoYUCk9
PR created @mirotalk-57bab571 https://github.com/miroslavpejic85/mirotalksfu/pull/228
-
I found the offending lines:
bucket: process.env.AWS_S3_BUCKET || 'mirotalk',const bucket = config?.integrations?.aws?.bucket;This would mean the
envwould beAWS_S3_BUCKETand notAWS_S3_BUCKET_NAME.
Confirmed with thisenvAll config options at https://github.com/miroslavpejic85/mirotalksfu/blob/main/.env.template PRESENTERS=admin@cloudron.local EMAIL_SEND_TO=admin@cloudron.local STATS_ENABLED=false RECORDING_UPLOAD_TO_S3=true AWS_S3_ENABLED=true AWS_S3_ENDPOINT=https://minio-api.cloudron.dev AWS_S3_BUCKET_NAME=sfu AWS_S3_BUCKET=sfu AWS_S3_FORCE_PATH_STYLE=true AWS_ACCESS_KEY_ID=LJQVOTFR3DZDG1QPOL0Y AWS_SECRET_ACCESS_KEY=j6w8j73VF8NE9wzsi4aupJICTrn45I0MKIoYUCk9
PR created @mirotalk-57bab571 https://github.com/miroslavpejic85/mirotalksfu/pull/228
@james said in MiroTalk SFU: Recording not possible?:
PR created @mirotalk-57bab571 https://github.com/miroslavpejic85/mirotalksfu/pull/228
Ops, you’re right, good catch! PR accepted. Thanks for confirming that everything works as expected. MiroTalk SFU can now upload recordings to any S3-compatible storage, not just AWS!

-
By the way, I opened an issue for MinIO here: https://github.com/minio/minio/issues/21694
It would be great if MinIO could properly show previews for .webm videos as well.
When I store the same recording in a rec folder in Cloudron, the video preview works correctly.
However, when the file is stored in MinIO storage, the preview does not work.It looks like the MIME type is not detected correctly, which causes the video tag to use:
type="video/mp4"even though the file is actually a
.webm.
This prevents browsers from playing the video.Proper support for serving
.webmwithContent-Type: video/webmwould fix the issue.
Implemented in MiroTalk SFU v.2.0.16