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.
- The
-
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!

Implemented in MiroTalk SFU v.2.0.16