PeerTube remote runner jobs getting stuck

I want to start this post by saying thanks to everyone working on this great project. I also want to come with a couple disclaimers:

  1. I didn’t follow the official tutorial exactly as I already have a nginx reverse proxy and a certbot Docker instance.
  2. I am doing this completely on a hobby basis for the fun of it, and do not have a public instance.

That said, my issue is the following: I set up a couple local machines as remote runners, and a lot of times the job gets stuck because the runner downloads it, transcodes successfully but then fails to upload it fully, and then the job gets stuck just saying « PROCESSING ».

The log of prunner.service then says

Sep 15 14:45:40 oldie prunner[15981]:       "message": "connect ENETUNREACH [IPv6 address here]",
Sep 15 14:45:40 oldie prunner[15981]:       "stack":
Sep 15 14:45:40 oldie prunner[15981]:           Error: connect ENETUNREACH [IPv6 address here]
Sep 15 14:45:40 oldie prunner[15981]:               at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1549:16)
Sep 15 14:45:40 oldie prunner[15981]:       "errno": -101,
Sep 15 14:45:40 oldie prunner[15981]:       "code": "ENETUNREACH",
Sep 15 14:45:40 oldie prunner[15981]:       "syscall": "connect",
Sep 15 14:45:40 oldie prunner[15981]:       "address": "[IPv6 address here]",
Sep 15 14:45:40 oldie prunner[15981]:       "port": 443
Sep 15 14:45:40 oldie prunner[15981]:     }

The strange thing is that sometimes it does go through, so if I restart prunner.service enough times I can get it to finish. It does take a lot of time though because it redoes downloading and transcoding too because it doesn’t keep the job until it is confirmed uploaded successfully. The actual issue seems to be the following:
image

That is a screenshot of both of my local runners, and they’re both on the same network. However, randomly PeerTube thinks the runners are on the Docker gateway network and randomly not, so whenever I refresh that page I never know whether it’s going to list the real outbound IP for the runner or the internal Docker gateway IP. I suspect that’s why the uploads fail, because somehow the nginx reverse proxy doesn’t proxy correctly at all times.

This is what I think are the relevant portions of my nginx config, just switched out the domain name to example.com to anonymize it:

# example.com/
upstream example.com {
    # Container: docker-peertube-1
    #     networks:
    #         docker_default (reachable)
    #     IP address: 172.18.0.42
    #     exposed ports (first ten): 1935/tcp 9000/tcp
    #     default port: 80
    #     using port: 9000
    #         /!\ WARNING: Virtual port published on host.  Clients
    #                      might be able to bypass nginx-proxy and
    #                      access the container's server directly.
    server 172.18.0.42:9000;
}
server {
    server_name example.com;
    access_log /var/log/nginx/access.log vhost;
    listen 80 ;
    # Do not HTTPS redirect Let's Encrypt ACME challenge
    location ^~ /.well-known/acme-challenge/ {
        auth_basic off;
        auth_request off;
        allow all;
        root /usr/share/nginx/html;
        try_files $uri =404;
        break;
    }
    location / {
        return 301 https://$host$request_uri;
    }
}
server {
    server_name example.com;
    access_log /var/log/nginx/access.log vhost;
    http2 on;
    listen 443 ssl ;
    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_certificate /etc/nginx/certs/example.com.crt;
    ssl_certificate_key /etc/nginx/certs/example.com.key;
    ssl_dhparam /etc/nginx/certs/example.com.dhparam.pem;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/nginx/certs/example.com.chain.pem;
    set $sts_header "";
    if ($https) {
        set $sts_header "max-age=31536000";
    }
    add_header Strict-Transport-Security $sts_header always;
    include /etc/nginx/vhost.d/example.com;
    location / {
        proxy_pass http://example.com;
        set $upstream_keepalive false;
    }
}

# configuration file /etc/nginx/vhost.d/example.com:
# Minimum Nginx version required:  1.13.0 (released Apr 25, 2017)
# Please check your Nginx installation features the following modules via 'nginx -V':
# STANDARD HTTP MODULES: Core, Proxy, Rewrite, Access, Gzip, Headers, HTTP/2, Log, Real IP, SSL, Thread Pool, Upstream, AIO Multithreading.
# THIRD PARTY MODULES:   None.

  ##
  # Performance optimizations
  # For extra performance please refer to https://github.com/denji/nginx-tuning
  ##

  # root /var/www/peertube/storage;
# 
  # Enable compression for JS/CSS/HTML, for improved client load times.
  # It might be nice to compress JSON/XML as returned by the API, but
  # leaving that out to protect against potential BREACH attack.
  gzip              on;
  gzip_vary         on;
  gzip_types        # text/html is always compressed by HttpGzipModule
                    text/css
                    application/javascript
                    font/truetype
                    font/opentype
                    application/vnd.ms-fontobject
                    image/svg+xml;
  gzip_min_length   1000; # default is 20 bytes
  gzip_buffers      16 8k;
  gzip_comp_level   2; # default is 1

  client_body_timeout       30s; # default is 60
  client_header_timeout     10s; # default is 60
  send_timeout              10s; # default is 60
  keepalive_timeout         10s; # default is 75
  resolver_timeout          10s; # default is 30
  reset_timedout_connection on;
  proxy_ignore_client_abort on;

  tcp_nopush                on; # send headers in one piece
  tcp_nodelay               on; # don't buffer data sent, good for small data bursts in real time

  ##
  # Application
  ##

  location @api {
  
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host            $host;
    proxy_set_header X-Real-IP       $remote_addr;

    client_max_body_size  100k; # default is 1M

    proxy_connect_timeout 10m;
    proxy_send_timeout    10m;
    proxy_read_timeout    10m;
    send_timeout          10m;

    proxy_pass http://example.com;
  }

  location ~ ^/api/v1/videos/(upload-resumable|([^/]+/source/replace-resumable))$ {
    client_max_body_size    0;
    proxy_request_buffering off;

    try_files /dev/null @api;
  }

  location ~ ^/api/v1/users/[^/]+/imports/import-resumable$ {
    client_max_body_size    0;
    proxy_request_buffering off;

    try_files /dev/null @api;
  }

  location ~ ^/api/v1/videos/(upload|([^/]+/studio/edit))$ {
    limit_except POST HEAD { deny all; }

    # This is the maximum upload size, which roughly matches the maximum size of a video file.
    # Note that temporary space is needed equal to the total size of all concurrent uploads.
    # This data gets stored in /var/lib/nginx by default, so you may want to put this directory
    # on a dedicated filesystem.
    client_max_body_size                      12G; # default is 1M
    add_header            X-File-Maximum-Size 8G always; # inform backend of the set value in bytes before mime-encoding (x * 1.4 >= client_max_body_size)

    try_files /dev/null @api;
  }

  location ~ ^/api/v1/runners/jobs/[^/]+/(update|success)$ {
    client_max_body_size                      12G; # default is 1M
    add_header            X-File-Maximum-Size 8G always; # inform backend of the set value in bytes before mime-encoding (x * 1.4 >= client_max_body_size)

    try_files /dev/null @api;
  }

  location ~ ^/api/v1/(videos|video-playlists|video-channels|users/me) {
    client_max_body_size                      6M; # default is 1M
    add_header            X-File-Maximum-Size 4M always; # inform backend of the set value in bytes before mime-encoding (x * 1.4 >= client_max_body_size)

    try_files /dev/null @api;
  }

  ##
  # Websocket
  ##

  location @api_websocket {
    proxy_http_version 1.1;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   Host            $host;
    proxy_set_header   X-Real-IP       $remote_addr;
    proxy_set_header   Upgrade         $http_upgrade;
    proxy_set_header   Connection      "upgrade";

    proxy_pass http://example.com;
  }

  location /socket.io {
    try_files /dev/null @api_websocket;
  }

  location /tracker/socket {
    # Peers send a message to the tracker every 15 minutes
    # Don't close the websocket before then
    proxy_read_timeout 15m; # default is 60s

    try_files /dev/null @api_websocket;
  }

  # Plugin websocket routes
  location ~ ^/plugins/[^/]+(/[^/]+)?/ws/ {
    try_files /dev/null @api_websocket;
  }
  

# configuration file /etc/nginx/conf.d/my_custom_proxy_settings.conf:
client_max_body_size 4096m;

I have the same issue. sometimes runners just stop for a while to transcript/transcode. for i.e. there is a list of 257 pending jobs « waiting for parent » but no process is occuring. it would be nice to add an action like « force to process » on the batch selectbox on the runner jobs list page.

peertube 6.2.1

1 Like

my runner is registered but stuck too

Okt 02 21:51:48 16C32T prunner[66667]: [21:51:48.401] WARN (66667): Cannot connect to https://dom.tld/runners socket
Okt 02 21:51:48 16C32T prunner[66667]: err: {
Okt 02 21:51:48 16C32T prunner[66667]: « description »: {
Okt 02 21:51:48 16C32T prunner[66667]: « error »: {
Okt 02 21:51:48 16C32T prunner[66667]: « message »: « Unexpected server response: 400 »,
Okt 02 21:51:48 16C32T prunner[66667]: « stack »:
Okt 02 21:51:48 16C32T prunner[66667]: Error: Unexpected server response: 400
Okt 02 21:51:48 16C32T prunner[66667]: at ClientRequest. (file:///usr/local/lib/node_modules/@peertube/peertube-runner/dist/peertube-runner.js:31347:11)
Okt 02 21:51:48 16C32T prunner[66667]: at ClientRequest.emit (node:events:519:28)
Okt 02 21:51:48 16C32T prunner[66667]: at HTTPParser.parserOnIncomingClient (node:_http_client:709:27)
Okt 02 21:51:48 16C32T prunner[66667]: at HTTPParser.parserOnHeadersComplete (node:_http_common:119:17)
Okt 02 21:51:48 16C32T prunner[66667]: at TLSSocket.socketOnData (node:_http_client:551:22)
Okt 02 21:51:48 16C32T prunner[66667]: at TLSSocket.emit (node:events:519:28)
Okt 02 21:51:48 16C32T prunner[66667]: at addChunk (node:internal/streams/readable:559:12)
Okt 02 21:51:48 16C32T prunner[66667]: at readableAddChunkPushByteMode (node:internal/streams/readable:510:3)
Okt 02 21:51:48 16C32T prunner[66667]: at Readable.push (node:internal/streams/readable:390:5)
Okt 02 21:51:48 16C32T prunner[66667]: at TLSWrap.onStreamRead (node:internal/stream_base_commons:191:23)
Okt 02 21:51:48 16C32T prunner[66667]: « type »: « Error »
Okt 02 21:51:48 16C32T prunner[66667]: },
Okt 02 21:51:48 16C32T prunner[66667]: « message »: « Unexpected server response: 400 »,
Okt 02 21:51:48 16C32T prunner[66667]: « stack »:
Okt 02 21:51:48 16C32T prunner[66667]:
Okt 02 21:51:48 16C32T prunner[66667]: « target »: {
Okt 02 21:51:48 16C32T prunner[66667]: « _autoPong »: true,
Okt 02 21:51:48 16C32T prunner[66667]: « _binaryType »: « nodebuffer »,
Okt 02 21:51:48 16C32T prunner[66667]: « _bufferedAmount »: 0,
Okt 02 21:51:48 16C32T prunner[66667]: « _closeCode »: 1006,
Okt 02 21:51:48 16C32T prunner[66667]: « _closeFrameReceived »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « _closeFrameSent »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « _closeMessage »: {
Okt 02 21:51:48 16C32T prunner[66667]: « data »: ,
Okt 02 21:51:48 16C32T prunner[66667]: « type »: « Buffer »
Okt 02 21:51:48 16C32T prunner[66667]: },
Okt 02 21:51:48 16C32T prunner[66667]: « _closeTimer »: null,
Okt 02 21:51:48 16C32T prunner[66667]: « _events »: {},
Okt 02 21:51:48 16C32T prunner[66667]: « _eventsCount »: 4,
Okt 02 21:51:48 16C32T prunner[66667]: « _extensions »: {},
Okt 02 21:51:48 16C32T prunner[66667]: « _isServer »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « _paused »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « _protocol »: «  »,
Okt 02 21:51:48 16C32T prunner[66667]: « _readyState »: 2,
Okt 02 21:51:48 16C32T prunner[66667]: « _receiver »: null,
Okt 02 21:51:48 16C32T prunner[66667]: « _redirects »: 0,
Okt 02 21:51:48 16C32T prunner[66667]: « _req »: {
Okt 02 21:51:48 16C32T prunner[66667]: « _closed »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « _contentLength »: 0,
Okt 02 21:51:48 16C32T prunner[66667]: « _defaultKeepAlive »: true,
Okt 02 21:51:48 16C32T prunner[66667]: « _ended »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « _events »: {},
Okt 02 21:51:48 16C32T prunner[66667]: « _eventsCount »: 4,
Okt 02 21:51:48 16C32T prunner[66667]: « _hasBody »: true,
Okt 02 21:51:48 16C32T prunner[66667]: « _header »: « GET /socket.io/?EIO=4&transport=websocket HTTP/1.1\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: SKbffiZhJ0yjhgvofJGwdQ==\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Extensions: permessage-deflate; client_max_window_bits\r\nHost: dom.tld\r\n\r\n »,
Okt 02 21:51:48 16C32T prunner[66667]: « _headerSent »: true,
Okt 02 21:51:48 16C32T prunner[66667]: « _keepAliveTimeout »: 0,
Okt 02 21:51:48 16C32T prunner[66667]: « _last »: true,
Okt 02 21:51:48 16C32T prunner[66667]: « _removedConnection »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « _removedContLen »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « _removedTE »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « _trailer »: «  »,
Okt 02 21:51:48 16C32T prunner[66667]: « aborted »: true,
Okt 02 21:51:48 16C32T prunner[66667]: « agent »: {
Okt 02 21:51:48 16C32T prunner[66667]: « _events »: « [Object] »,
Okt 02 21:51:48 16C32T prunner[66667]: « _eventsCount »: 2,
Okt 02 21:51:48 16C32T prunner[66667]: « _sessionCache »: « [Object] »,
Okt 02 21:51:48 16C32T prunner[66667]: « defaultPort »: 443,
Okt 02 21:51:48 16C32T prunner[66667]: « freeSockets »: {},
Okt 02 21:51:48 16C32T prunner[66667]: « keepAlive »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « keepAliveMsecs »: 1000,
Okt 02 21:51:48 16C32T prunner[66667]: « maxCachedSessions »: 100,
Okt 02 21:51:48 16C32T prunner[66667]: « maxFreeSockets »: 256,
Okt 02 21:51:48 16C32T prunner[66667]: « maxSockets »: null,
Okt 02 21:51:48 16C32T prunner[66667]: « maxTotalSockets »: null,
Okt 02 21:51:48 16C32T prunner[66667]: « options »: « [Object] »,
Okt 02 21:51:48 16C32T prunner[66667]: « protocol »: « https: »,
Okt 02 21:51:48 16C32T prunner[66667]: « requests »: {},
Okt 02 21:51:48 16C32T prunner[66667]: « scheduling »: « lifo »,
Okt 02 21:51:48 16C32T prunner[66667]: « sockets »: « [Object] »,
Okt 02 21:51:48 16C32T prunner[66667]: « totalSocketCount »: 1
Okt 02 21:51:48 16C32T prunner[66667]: },
Okt 02 21:51:48 16C32T prunner[66667]: « chunkedEncoding »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « destroyed »: true,
Okt 02 21:51:48 16C32T prunner[66667]: « finished »: true,
Okt 02 21:51:48 16C32T prunner[66667]: « host »: « dom.tld »,
Okt 02 21:51:48 16C32T prunner[66667]: « maxHeadersCount »: null,
Okt 02 21:51:48 16C32T prunner[66667]: « maxRequestsOnConnectionReached »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « method »: « GET »,
Okt 02 21:51:48 16C32T prunner[66667]: « outputData »: ,
Okt 02 21:51:48 16C32T prunner[66667]: « outputSize »: 0,
Okt 02 21:51:48 16C32T prunner[66667]: « parser »: null,
Okt 02 21:51:48 16C32T prunner[66667]: « path »: « /socket.io/?EIO=4&transport=websocket »,
Okt 02 21:51:48 16C32T prunner[66667]: « protocol »: « https: »,
Okt 02 21:51:48 16C32T prunner[66667]: « res »: {
Okt 02 21:51:48 16C32T prunner[66667]: « _consuming »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « _dumped »: true,
Okt 02 21:51:48 16C32T prunner[66667]: « _events »: « [Object] »,
Okt 02 21:51:48 16C32T prunner[66667]: « _eventsCount »: 1,
Okt 02 21:51:48 16C32T prunner[66667]: « _readableState »: « [Object] »,
Okt 02 21:51:48 16C32T prunner[66667]: « aborted »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « client »: « [Object] »,
Okt 02 21:51:48 16C32T prunner[66667]: « complete »: true,
Okt 02 21:51:48 16C32T prunner[66667]: « httpVersion »: « 1.1 »,
Okt 02 21:51:48 16C32T prunner[66667]: « httpVersionMajor »: 1,
Okt 02 21:51:48 16C32T prunner[66667]: « httpVersionMinor »: 1,
Okt 02 21:51:48 16C32T prunner[66667]: « method »: null,
Okt 02 21:51:48 16C32T prunner[66667]: « rawHeaders »: « [Array] »,
Okt 02 21:51:48 16C32T prunner[66667]: « rawTrailers »: ,
Okt 02 21:51:48 16C32T prunner[66667]: « req »: « [Circular] »,
Okt 02 21:51:48 16C32T prunner[66667]: « socket »: « [Object] »,
Okt 02 21:51:48 16C32T prunner[66667]: « statusCode »: 400,
Okt 02 21:51:48 16C32T prunner[66667]: « statusMessage »: « Bad Request »,
Okt 02 21:51:48 16C32T prunner[66667]: « upgrade »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « url »: «  »
Okt 02 21:51:48 16C32T prunner[66667]: },
Okt 02 21:51:48 16C32T prunner[66667]: « reusedSocket »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « sendDate »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « shouldKeepAlive »: true,
Okt 02 21:51:48 16C32T prunner[66667]: « socket »: {
Okt 02 21:51:48 16C32T prunner[66667]: « _SNICallback »: null,
Okt 02 21:51:48 16C32T prunner[66667]: « _closeAfterHandlingError »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « _controlReleased »: true,
Okt 02 21:51:48 16C32T prunner[66667]: « _events »: « [Object] »,
Okt 02 21:51:48 16C32T prunner[66667]: « _eventsCount »: 9,
Okt 02 21:51:48 16C32T prunner[66667]: « _hadError »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « _host »: « dom.tld »,
Okt 02 21:51:48 16C32T prunner[66667]: « _httpMessage »: « [Circular] »,
Okt 02 21:51:48 16C32T prunner[66667]: « _newSessionPending »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « _parent »: null,
Okt 02 21:51:48 16C32T prunner[66667]: « _pendingData »: null,
Okt 02 21:51:48 16C32T prunner[66667]: « _pendingEncoding »: «  »,
Okt 02 21:51:48 16C32T prunner[66667]: « _readableState »: « [Object] »,
Okt 02 21:51:48 16C32T prunner[66667]: « _rejectUnauthorized »: true,
Okt 02 21:51:48 16C32T prunner[66667]: « _requestCert »: true,
Okt 02 21:51:48 16C32T prunner[66667]: « _secureEstablished »: true,
Okt 02 21:51:48 16C32T prunner[66667]: « _securePending »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « _server »: null,
Okt 02 21:51:48 16C32T prunner[66667]: « _sockname »: null,
Okt 02 21:51:48 16C32T prunner[66667]: « _tlsOptions »: « [Object] »,
Okt 02 21:51:48 16C32T prunner[66667]: « _writableState »: « [Object] »,
Okt 02 21:51:48 16C32T prunner[66667]: « allowHalfOpen »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « alpnProtocol »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « authorizationError »: null,
Okt 02 21:51:48 16C32T prunner[66667]: « authorized »: true,
Okt 02 21:51:48 16C32T prunner[66667]: « connecting »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « encrypted »: true,
Okt 02 21:51:48 16C32T prunner[66667]: « parser »: null,
Okt 02 21:51:48 16C32T prunner[66667]: « secureConnecting »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « servername »: « dom.tld »,
Okt 02 21:51:48 16C32T prunner[66667]: « ssl »: null
Okt 02 21:51:48 16C32T prunner[66667]: },
Okt 02 21:51:48 16C32T prunner[66667]: « strictContentLength »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « timeoutCb »: null,
Okt 02 21:51:48 16C32T prunner[66667]: « upgradeOrConnect »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « useChunkedEncodingByDefault »: false,
Okt 02 21:51:48 16C32T prunner[66667]: « writable »: true
Okt 02 21:51:48 16C32T prunner[66667]: },
Okt 02 21:51:48 16C32T prunner[66667]: « _sender »: null,
Okt 02 21:51:48 16C32T prunner[66667]: « _socket »: null,
Okt 02 21:51:48 16C32T prunner[66667]: « _url »: « wss://dioxitube.com/socket.io/?EIO=4&transport=websocket »
Okt 02 21:51:48 16C32T prunner[66667]: },
Okt 02 21:51:48 16C32T prunner[66667]: « type »: « ErrorEvent »
Okt 02 21:51:48 16C32T prunner[66667]: },
Okt 02 21:51:48 16C32T prunner[66667]: « message »: « websocket error »,
Okt 02 21:51:48 16C32T prunner[66667]: « stack »:
Okt 02 21:51:48 16C32T prunner[66667]: Error: websocket error
Okt 02 21:51:48 16C32T prunner[66667]: at WS.onError (file:///usr/local/lib/node_modules/@peertube/peertube-runner/dist/peertube-runner.js:69128:33)
Okt 02 21:51:48 16C32T prunner[66667]: at ws.onerror (file:///usr/local/lib/node_modules/@peertube/peertube-runner/dist/peertube-runner.js:69764:35)
Okt 02 21:51:48 16C32T prunner[66667]: at callListener (file:///usr/local/lib/node_modules/@peertube/peertube-runner/dist/peertube-runner.js:30539:18)
Okt 02 21:51:48 16C32T prunner[66667]: at _WebSocket.onError (file:///usr/local/lib/node_modules/@peertube/peertube-runner/dist/peertube-runner.js:30493:13)
Okt 02 21:51:48 16C32T prunner[66667]: at _WebSocket.emit (node:events:519:28)
Okt 02 21:51:48 16C32T prunner[66667]: at emitErrorAndClose (file:///usr/local/lib/node_modules/@peertube/peertube-runner/dist/peertube-runner.js:31429:17)
Okt 02 21:51:48 16C32T prunner[66667]: at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
Okt 02 21:51:48 16C32T prunner[66667]: « type »: « TransportError »
Okt 02 21:51:48 16C32T prunner[66667]: }

Hi,

Please paste server logs to have more information on the 400 error

HomeServerIP - - [03/Oct/2024:12:36:04 +0200] "GET /socket.io/?EIO=4&transport=websocket HTTP/1.0" 400 34 "-" "-"

Do you use nginx? If yes please the config

Enabling debug logs can also help on peertube side

i can register the runner
but there is no reconnect
it runs successful again when i restart the service

systemctl restart prunner.service

after all jobs are done the connection is lost again
Last contact shows the end of the last job
and jobs are filling the queue and wait for my manual prunner.service restart
i dont think nginx is the point of failure