Skip to content

Video upload never completes on self-hosted Cap #1902

@tamas-adam

Description

@tamas-adam

Description

Hello! I'm running Cap in a VM on a Proxmox host behind an Nginx reverse proxy. The initial issue I encountered was that AI features were not working, meaning that AI summaries and transcriptions were never automatically generated (and clicking "Retry Transcription" would never actually do anything, the spinner would spin indefinitely), even though the required API keys are configured and AI features are enabled. Then I've noticed that when navigating to the a specific Cap, roughly every second there is a request sent to /api/erpc and /s/:videoId. The response returned by these endpoints are as follows:

[{"_tag":"Exit","requestId":"27","exit":{"_tag":"Success","value":{"_tag":"Some","value":{"uploaded":2631508,"total":2631508,"startedAt":"2026-06-08T08:59:47.000Z","updatedAt":"2026-06-08T08:59:48.000Z","phase":"uploading","processingProgress":0,"processingMessage":null,"processingError":null}}}}]

and

0:{"a":"$@1","f":"","b":"LcBP1WymD_Tq-zLJeOey2"}
1:{"transcriptionStatus":null,"aiGenerationStatus":null,"aiTitle":null,"summary":null,"chapters":null}

respectively. The response returned by /api/erpc is interesting, because the phase property never actually changes from "uploading" to anything, even though the video itself is uploaded without issues. I'm not sure why this happens, perhaps my nginx configurations are incorrect somehow, but I guess since the status never actually changes to "uploaded", or "completed", or something similar, AI summaries and transcriptions are not generated.

I've looked through existing GitHub issues, but couldn't find anything that would match this issue exactly, though there were some where I saw some similarities. It is also worth mentioning that I've encountered the "detached ArrayBuffer.prototype.slice" error once, though I couldn't reproduce it later; I'm not entirely sure what to make of that.

I've also encountered other issues, I'm not sure whether they're related or not:

Bad header [4ddef7e0-8961a798a851e105.js:1:40578](https://captest.inspyre.systems/_next/static/chunks/4ddef7e0-8961a798a851e105.js)
    NextJS 3
    <anonymous> https://unpkg.com/@rive-app/canvas@2.27.1/rive.wasm:1043797
    <anonymous> https://unpkg.com/@rive-app/canvas@2.27.1/rive.wasm:20818
    <anonymous> https://unpkg.com/@rive-app/canvas@2.27.1/rive.wasm:20991
    <anonymous> https://unpkg.com/@rive-app/canvas@2.27.1/rive.wasm:57682
    <anonymous> https://unpkg.com/@rive-app/canvas@2.27.1/rive.wasm:55925
    NextJS 43

and

Uncaught (in promise) Error: The file failed to load
    NextJS 42
[4ddef7e0-8961a798a851e105.js:1:91310](https://captest.inspyre.systems/_next/static/chunks/4ddef7e0-8961a798a851e105.js)
    NextJS 33

Reproduction

I'm not entirely sure how to reproduce this issue, I followed the instructions on self-hosting Cap. Nginx is installed on the Proxmox host itself and is configured with a public Cap and Minio endpoint. The configuration as follows:

server {
	server_name captest.inspyre.systems;

	# Timeouts for long-running uploads/streams
	proxy_read_timeout 300s;
	proxy_send_timeout 300s;
	proxy_connect_timeout 75s;

	# Required for large video uploads
	client_max_body_size 100M;

	ignore_invalid_headers off;
	proxy_buffering off;
	proxy_request_buffering off;
	
	location / {
		proxy_pass http://10.0.0.10:3000;

	        proxy_ssl_verify off;

		proxy_set_header Host $host;
	        proxy_set_header X-Real-IP $remote_addr;
	        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	        proxy_set_header X-Forwarded-Proto $scheme;

	        proxy_http_version 1.1;

	        proxy_set_header Upgrade $http_upgrade;
	        proxy_set_header Connection "upgrade";
	}

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/captest.inspyre.systems/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/captest.inspyre.systems/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = captest.inspyre.systems) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


	listen 80;
	server_name captest.inspyre.systems;
    return 404; # managed by Certbot


}

The only differences between this and Minio Nginx config is the server name and the port to which the request is forwarded (9000). The .env file is as follows (secrets and passwords have been removed):

CAP_URL=https://captest.inspyre.systems
S3_PUBLIC_URL=https://miniotest.inspyre.systems
RESEND_API_KEY=...
RESEND_FROM_DOMAIN=inspyre.me
NEXTAUTH_SECRET=...
DATABASE_ENCRYPTION_KEY=...
MEDIA_SERVER_WEBHOOK_SECRET=...
MINIO_ROOT_PASSWORD=...
MYSQL_PASSWORD=...
OPENAI_API_KEY=...
GROQ_API_KEY=...
DEEPGRAM_API_KEY=...

Additional Context

  • Cap version: latest docker install
  • Operating system, version: Ubuntu server 26.04

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions