Talk recording with nextcloud 32

Support intro

Sorry to hear you’re facing problems :slightly_frowning_face:

help.nextcloud.com is for home/non-enterprise users. If you’re running a business, paid support can be accessed via portal.nextcloud.com where we can ensure your business keeps running smoothly.

In order to help you as quickly as possible, before clicking Create Topic please provide as much of the below as you can. Feel free to use a pastebin service for logs, otherwise either indent short log examples with four spaces:

example

Or for longer, use three backticks above and below the code snippet:

longer
example
here

Some or all of the below information will be requested if it isn’t supplied; for fastest response please provide as much as you can :heart:

Some useful links to gather information about your Nextcloud Talk installation:
Information about Signaling server: /index.php/index.php/settings/admin/talk#signaling_server
Information about TURN server: /index.php/settings/admin/talk#turn_server
Information about STUN server: /index.php/settings/admin/talk#stun_server

Nextcloud version (eg, 24.0.1): 32.0.0
Talk Server version (eg, 14.0.2): 22.0.0
Custom Signaling server configured: yes Docker 2.0.4
Custom TURN server configured: yes
Custom STUN server configured: yes

In case the web version of Nextcloud Talk is involved:
Operating system (eg, Windows/Ubuntu/…): Debian 12
Browser name and version (eg, Chrome v101): Firefox

The issue you are facing: error on starting recording

Is this the first time you’ve seen this error? (Y/N): Y

Steps to replicate it:

  1. configure talk recording with nextcloud/aio-talk-recording:latest

  2. start talk room

  3. start recording => failded

The output of your Nextcloud log in Admin > Logging or errors in nextcloud.log in /var/www/:

HERE{"reqId":"XmOsHHXZ4tCG2PhYjfz0","level":3,"time":"2025-10-14T17:27:51+02:00","remoteAddr":"172.22.0.2","user":"--","app":"PHP","method":"GET","url":"/ocs/v2.php/cloud/capabilities","message":"Unknown: Use of mbstring.http_input is deprecated at Unknown#0","userAgent":"nextcloud-spreed-signaling/2.0.4~docker","version":"32.0.0.13","data":{"app":"PHP"}}
{"reqId":"Mun1XzicMY1L0R4SnnvK","level":3,"time":"2025-10-14T17:27:51+02:00","remoteAddr":"172.22.0.2","user":"--","app":"PHP","method":"POST","url":"/ocs/v2.php/apps/spreed/api/v3/signaling/backend","message":"Unknown: Use of mbstring.http_input is deprecated at Unknown#0","userAgent":"nextcloud-spreed-signaling/2.0.4~docker","version":"32.0.0.13","data":{"app":"PHP"}}
{"reqId":"7pstMN24SFUM3tB17zHp","level":3,"time":"2025-10-14T17:27:54+02:00","remoteAddr":"ip-client","user":"admin","app":"spreed","method":"POST","url":"/ocs/v2.php/apps/spreed/api/v1/recording/u5pf4edi","message":"Failed to send message to recording server","userAgent":"Mozilla/5.0 (X11; Linux x86_64; rv:143.0) Gecko/20100101 Firefox/143.0","version":"32.0.0.13","exception":{"Exception":"GuzzleHttp\\Exception\\ClientException","Message":"Client error: `POST http://127.0.0.1:1235/api/v1/room/u5pf4edi` resulted in a `403 FORBIDDEN` response:\n<!doctype html>\n<html lang=en>\n<title>403 Forbidden</title>\n<h1>Forbidden</h1>\n<p>You don&#39;t have the permission to a (truncated...)\n","Code":403,"Trace":[{"file":"/var/www/url-nextcloud/www/3rdparty/guzzlehttp/guzzle/src/Middleware.php","line":72,"function":"create","class":"GuzzleHttp\\Exception\\RequestException","type":"::","args":["*** sensitive parameters replaced ***"]},{"file":"/var/www/url-nextcloud/www/3rdparty/guzzlehttp/promises/src/Promise.php","line":209,"function":"GuzzleHttp\\{closure}","class":"GuzzleHttp\\Middleware","type":"::","args":["*** sensitive parameters replaced ***"]},{"file":"/var/www/url-nextcloud/www/3rdparty/guzzlehttp/promises/src/Promise.php","line":158,"function":"callHandler","class":"GuzzleHttp\\Promise\\Promise","type":"::","args":[1,"*** sensitive parameters replaced ***","*** sensitive parameters replaced ***"]},{"file":"/var/www/url-nextcloud/www/3rdparty/guzzlehttp/promises/src/TaskQueue.php","line":52,"function":"GuzzleHttp\\Promise\\{closure}","class":"GuzzleHttp\\Promise\\Promise","type":"::","args":["*** sensitive parameters replaced ***"]},{"file":"/var/www/url-nextcloud/www/3rdparty/guzzlehttp/promises/src/Promise.php","line":251,"function":"run","class":"GuzzleHttp\\Promise\\TaskQueue","type":"->","args":[true]},{"file":"/var/www/url-nextcloud/www/3rdparty/guzzlehttp/promises/src/Promise.php","line":227,"function":"invokeWaitFn","class":"GuzzleHttp\\Promise\\Promise","type":"->","args":[]},{"file":"/var/www/url-nextcloud/www/3rdparty/guzzlehttp/promises/src/Promise.php","line":272,"function":"waitIfPending","class":"GuzzleHttp\\Promise\\Promise","type":"->","args":[]},{"file":"/var/www/url-nextcloud/www/3rdparty/guzzlehttp/promises/src/Promise.php","line":229,"function":"invokeWaitList","class":"GuzzleHttp\\Promise\\Promise","type":"->","args":[]},{"file":"/var/www/url-nextcloud/www/3rdparty/guzzlehttp/promises/src/Promise.php","line":69,"function":"waitIfPending","class":"GuzzleHttp\\Promise\\Promise","type":"->","args":[]},{"file":"/var/www/url-nextcloud/www/3rdparty/guzzlehttp/guzzle/src/Client.php","line":189,"function":"wait","class":"GuzzleHttp\\Promise\\Promise","type":"->","args":[]},{"file":"/var/www/url-nextcloud/www/lib/private/Http/Client/Client.php","line":277,"function":"request","class":"GuzzleHttp\\Client","type":"->","args":["post","*** sensitive parameters replaced ***",{"verify":"/var/www/url-nextcloud/www/resources/config/ca-bundle.crt","timeout":30,"headers":{"Content-Type":"application/json","Talk-Recording-Random":"pTFqlXqroB6mkFHhYrfKIEH4dc+axD/jlYDI3bBkF97bviYo70XxCUVGFZ9cLCPt","Talk-Recording-Checksum":"d8779d2e2697226db4276b6fd42cc6b9f31dcef8c3b6256caa57075136da2478","Talk-Recording-Backend":"https://url-nextcloud/","User-Agent":"Nextcloud Server Crawler","0":"And 1 more entries, set log level to debug to see all entries"},"body":"{\"type\":\"start\",\"start\":{\"status\":1,\"owner\":\"admin\",\"actor\":{\"type\":\"users\",\"id\":\"admin\"}}}","nextcloud":{"allow_local_address":true},"0":"And 1 more entries, set log level to debug to see all entries"}]},{"file":"/var/www/url-nextcloud/www/apps/spreed/lib/Recording/BackendNotifier.php","line":52,"function":"post","class":"OC\\Http\\Client\\Client","type":"->","args":["*** sensitive parameters replaced ***"]},{"file":"/var/www/url-nextcloud/www/apps/spreed/lib/Recording/BackendNotifier.php","line":116,"function":"doRequest","class":"OCA\\Talk\\Recording\\BackendNotifier","type":"->","args":["*** sensitive parameters replaced ***","*** sensitive parameters replaced ***"]},{"file":"/var/www/url-nextcloud/www/apps/spreed/lib/Recording/BackendNotifier.php","line":121,"function":"backendRequest","class":"OCA\\Talk\\Recording\\BackendNotifier","type":"->","args":[{"__class__":"OCA\\Talk\\Room"},{"type":"start","start":{"status":1,"owner":"admin","actor":{"type":"users","id":"admin"}}}]},{"file":"/var/www/url-nextcloud/www/apps/spreed/lib/Service/RecordingService.php","line":106,"function":"start","class":"OCA\\Talk\\Recording\\BackendNotifier","type":"->","args":[{"__class__":"OCA\\Talk\\Room"},1,"admin",{"__class__":"OCA\\Talk\\Participant"}]},{"file":"/var/www/url-nextcloud/www/apps/spreed/lib/Controller/RecordingController.php","line":346,"function":"start","class":"OCA\\Talk\\Service\\RecordingService","type":"->","args":[{"__class__":"OCA\\Talk\\Room"},1,"admin",{"__class__":"OCA\\Talk\\Participant"}]},{"file":"/var/www/url-nextcloud/www/lib/private/AppFramework/Http/Dispatcher.php","line":204,"function":"start","class":"OCA\\Talk\\Controller\\RecordingController","type":"->","args":[1]},{"file":"/var/www/url-nextcloud/www/lib/private/AppFramework/Http/Dispatcher.php","line":118,"function":"executeController","class":"OC\\AppFramework\\Http\\Dispatcher","type":"->","args":[{"__class__":"OCA\\Talk\\Controller\\RecordingController"},"start"]},{"file":"/var/www/url-nextcloud/www/lib/private/AppFramework/App.php","line":153,"function":"dispatch","class":"OC\\AppFramework\\Http\\Dispatcher","type":"->","args":[{"__class__":"OCA\\Talk\\Controller\\RecordingController"},"start"]},{"file":"/var/www/url-nextcloud/www/lib/private/Route/Router.php","line":321,"function":"main","class":"OC\\AppFramework\\App","type":"::","args":["OCA\\Talk\\Controller\\RecordingController","start",{"__class__":"OC\\AppFramework\\DependencyInjection\\DIContainer"},{"_route":"ocs.spreed.recording.start","apiVersion":"v1","token":"u5pf4edi"}]},{"file":"/var/www/url-nextcloud/www/ocs/v1.php","line":61,"function":"match","class":"OC\\Route\\Router","type":"->","args":["/ocsapp/apps/spreed/api/v1/recording/u5pf4edi"]},{"file":"/var/www/url-nextcloud/www/ocs/v2.php","line":8,"args":["/var/www/url-nextcloud/www/ocs/v1.php"],"function":"require_once"}],"File":"/var/www/url-nextcloud/www/3rdparty/guzzlehttp/guzzle/src/Exception/RequestException.php","Line":111,"message":"Failed to send message to recording server","exception":{},"CustomMessage":"Failed to send message to recording server"}}

The output of your Apache/nginx/system log in /var/log/____:No error

Your browser log if relevant (javascript console log, network log, etc.):

No error chown

Recording error

WARNING:nextcloud.talk.recording.Server:Checksum verification failed: d8779d2e2697226db4276b6fd42cc6b9f31dcef8c3b6256caa57075136da2478 92717dc5f0473ba44f5a1a57b5e76db297c5bb2c324911b18f390fdf5e5a2e3d

NB : It’s Works with Nextcloud 31

Thanks

Hello. AIO Talk recording is working on version 32 BTW (i made a fresh install).

Could you check if your secrets are correct?

Really i do not sure, I this they are right but…

This is the signaling server.conf

#[http]
#listen = 0.0.0.0:8080
#readtimeout = 15
#writetimeout = 30

[https]
listen = 0.0.0.0:8443
readtimeout = 15
writetimeout = 30

# Certificate / private key to use for the HTTPS server.
certificate = /etc/ssl/certs/talkcert.pem
key = /etc/ssl/private/talkkey.pem

[sessions]
hashkey = 7d5...........800
blockkey = 794...........2a1

[clients]
internalsecret = e90.........52c

[backend]
backendtype = static
backends = nextcloud
allowall = false
secret = 384................353
timeout=10
connectionsperhost = 8

[nextcloud]
urls = https://nextcloud.xxxx.yy/
sessionlimit = 1000

[nats]
url = nats://loopback

[mcu]
type = janus
url = ws://172.16.60.74:8188

[turn]
secret = 0e8.............0859
urls = turn:talk.nextcloud.xxxx.yy:3478?transport=udp,turn:talk.nextcloud.xxxx.yy:5349?transport=tcp

[stats]
allowed_ips = 172.16.0.0/16

[grpc]
# IP and port to listen on for GRPC requests.
# Comment line to disable the listener.
listen = 0.0.0.0:9090

# Certificate / private key to use for the GRPC server.
# Omit to use unencrypted connections.
servercertificate = /etc/ssl/certs/talkcert.pem
serverkey = /etc/ssl/private/talkkey.pem
serverca = /etc/ssl/certs/talkcert.pem

#[recording]
#secret = 7c9.................ef3

[logging]
level = info

And this is the recording server.conf

[logs]
level = 10

[https]
# Escuchar en HTTPS con TLS
listen = 0.0.0.0:8443
tls_cert = /etc/ssl/certs/onlycert.pem
tls_key = /etc/ssl/private/onlykey.pem

[app]
trustedproxies = 172.16.60.0/24

[backend]
allowall = false
backends = nextcloud
skipverify = false
maxmessagesize = 10240
videowidth = 1920
videoheight = 1080
directory = /var/lib/nextcloud-recordings

[nextcloud]
url = https://nextcloud.xxxx.yy/
secret = 46c............414

[signaling]
signalings = talk-ifca

[talk-ifca]
url = https://talk.nextcloud.xxxx.yy:8443
#internalsecret = 7c9............ef3
internalsecret = e90.............52c

[ffmpeg]
common = ffmpeg -loglevel level+warning -n
inputaudio = -f pulse -i default
inputvideo = -f x11grab -draw_mouse 0 -video_size {WIDTH}x{HEIGHT} -framerate 30 -i :99
outputaudio = -c:a libopus -b:a 128k
outputvideo = -c:v libvpx -deadline:v realtime -crf 10 -b:v 2M -threads 4
extensionaudio = .ogg
extensionvideo = .webm

[recording]
browser = firefox
browserPath = /usr/bin/firefox

[stats]
allowed_ips = 172.16.60.0/24, 127.0.0.1

looking at nextcloud talk app conf key is the same as recordinf server.conf ( under [nextcloud] seacret):

sudo -u www-data php /var/www/nextcloud/occ config:app:get spreed recording_servers
{“servers”:[{“server”:“https:/only.nextcloud.ifca.es:8443”,“verify”:true}],“secret”:“46c…414”}

and for signaling at nextcloud app is the as under signaling server [backend] secret:

sudo -u www-data php /var/www/nextcloud/occ talk:signaling:list
servers:
0:
server: https:/talk.nextcloud.ifca.es:8443
verify: true
secret: 384………….353

the mesage is clear but I not be able to find the mistake ;(
regards, I

@henriquemohr yes secrets are sames

# sudo -u nextcloud-rocks php8.4 occ talk:signaling:list
servers:
0:
server: https:///standalone-signaling
verify: true
secret: eit
***************oofu

sudo -u nextcloud-rocks php8.4 occ config:app:get spreed recording_servers

{“servers”:[{“server”:“https://.ovh",“verify”:true}],“secret”:"eit*********oofu”}

Cool! Did you manage to get working?

I spent sometime studying how nextcloud AIO implements recording and documented in this repo

Also i found easier to deploy on a subdomain rather in a path, but its up to you.

1 Like

Yes It is a subdomain with a specific url and ssl with apache proxy.

1 Like

@henriquemohr it seems to be a 403 error on vhost, but vhost is same with Nextcloud 31.

<VirtualHost *:80>
  ServerName url-recording
  Redirect Permanent / https://url-recording/
</VirtualHost>
<VirtualHost *:443>
  ServerName url-recording

    LogLevel warn
    ErrorLog "|/usr/bin/rotatelogs -lc /var/log/apache2/recording_error.%Y.%m.%d 86400"
    CustomLog "|/usr/bin/rotatelogs -lc /var/log/apache2/recording_access.%Y.%m.%d 86400" combined


    # SSL configuration, you may want to take the easy route instead and use Lets Encrypt!
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/url-recording/cert.pem
    SSLCertificateChainFile /etc/letsencrypt/live/url-recording/chain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/url-recording/privkey.pem

    # HSTS (mod_headers is required) (15768000 seconds = 6 months)
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"

    # Activate http/2
    Protocols h2 h2c http/1.1

    H2Push          on
    H2PushPriority  *                       after
    H2PushPriority  text/css                before
    H2PushPriority  image/jpeg              after   32
    H2PushPriority  image/png               after   32
    H2PushPriority  application/javascript  interleaved

    # Encoded slashes need to be allowed
    AllowEncodedSlashes NoDecode

    # Container uses a unique non-signed certificate
    SSLProxyEngine On
    SSLProxyVerify None
    SSLProxyCheckPeerCN Off
    SSLProxyCheckPeerName Off

    # keep the host
    ProxyPreserveHost On

    # Preserve host
    ProxyPreserveHost On
    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
  
    ProxyPass / http://127.0.0.1:1234/ 

</VirtualHost>

I think it’s a problem with the image. You could either build your own image or rollback to the previous that was working.

I compiler my version from official repository : https://github.com/nextcloud/nextcloud-talk-recording

Same error :
nextcloud-talk-recording-1 | WARNING:nextcloud.talk.recording.Server:Checksum verification failed: f411b49ec6e4d6740576e9fe1a7d4c181d89d983c9ec2445f3d8dbbadaf8f4e2 1ebc9f7c4e16700a30a4aa7f49e11aaec1e0cfe684f7b6c50bc9dbaead1351dd
nextcloud-talk-recording-1 | INFO:werkzeug:172.20.0.1 - - [13/Jan/2026 09:21:18] “POST /api/v1/room/i2gka69f HTTP/1.1” 403 -

I use Nextcloud Talk with HPB and Recording Service using Docker containers. Maybe my article can help you with that: Nextcloud Talk High Performance Backend with Docker | Arno Welzel

@awelzel I’ll go to read it today and saw differences between you’re installation and mine

@awelzel Since my configuration is quite similar to yours, I checked everything, vhost, container configuration, and I think my problem came from the token generation I was doing with pwgen 32 1. I see that as the explanation because now it works.

Your article is very well written. Would you allow me to translate it in french on our blog and cite you as a reference?

Thanks for your kind words. All my content is published under CC BY-SA 3.0. So - yes, you can translate the article and also cite it as reference as long as you add a link to the original article.

@awelzel : my article Mise en place de services HPB pour Nextcloud Talk - Aukfood

2 Likes

A very detailed article. Thanks for the credits.

1 Like