Skip to content

Videos not uploading to S3 - bucket remains empty despite successful upload UI #1455

@c0ball

Description

@c0ball

Description

Problem: Videos uploaded to Cap are not viewable, and the S3 bucket (Garage) remains empty despite successful upload UI feedback and no error logs.

When attempting to upload a video through Cap's web interface:

  • The upload appears to complete successfully (no errors shown to user)
  • No errors appear in Docker logs during upload
  • The S3 bucket remains completely empty (verified via external S3 client)
  • Attempting to view the uploaded video fails silently

Expected behavior: Videos should be uploaded to the Garage S3 bucket and be viewable through the Cap interface.

Actual behavior: Upload completes without errors, but no files are written to S3 storage.

Image

Logs

When attempting to view an uploaded video:

cap-web  | [ShareVideoPage] Starting transcription for video: re0msnz8094jdqf
cap-web  | [ShareVideoPage] Updated transcription status: null
cap-web  | timestamp=2025-12-17T20:39:58.554Z level=INFO fiber=#188 message="Using CAP_AWS_ACCESS_KEY and CAP_AWS_SECRET_KEY"
cap-web  | [next-auth][warn][DEBUG_ENABLED] 
cap-web  | https://next-auth.js.org/warnings#debug_enabled

Full startup logs show successful initialization:

cap-web  | 💿 Migrations run successfully!
cap-web  | Created S3 bucket

No upload errors are logged during the video upload process.

Environment

  • Cap version: ghcr.io/capsoftware/cap-web:latest (SHA: 74d56685cf9c3c856cceab23fef6a6bdef1370d201cbf0431d6c95504c971554)
  • S3 Provider: Garage v2.1.0 (self-hosted, S3-compatible storage)
  • Database: MySQL 8.4
  • Deployment: Docker Compose

Configuration

Docker Compose:

name: cap-production
services:
  cap-web:
    container_name: cap-web
    image: ghcr.io/capsoftware/cap-web:latest@sha256:74d56685cf9c3c856cceab23fef6a6bdef1370d201cbf0431d6c95504c971554
    restart: unless-stopped
    networks:
      - default
    environment:
      DATABASE_URL: 'mysql://cap_user:${DB_PASSWORD}@cap-db:3306/cap?ssl={"rejectUnauthorized":false}'
      WEB_URL: https://cap.example.com
      NEXTAUTH_URL: https://cap.example.com
      DATABASE_ENCRYPTION_KEY: ${DATABASE_ENCRYPTION_KEY}
      NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
      
      # S3 Configuration (Garage)
      CAP_AWS_ACCESS_KEY: ${S3_ACCESS_KEY}
      CAP_AWS_SECRET_KEY: ${S3_SECRET_KEY}
      CAP_AWS_BUCKET: cap
      CAP_AWS_REGION: garage
      CAP_AWS_BUCKET_URL: https://garage.example.com
      S3_INTERNAL_ENDPOINT: https://garage.example.com
      S3_PUBLIC_ENDPOINT: https://garage.example.com
      S3_PATH_STYLE: true
      
      CAP_VIDEOS_DEFAULT_PUBLIC: true

  cap-db:
    container_name: cap-db
    image: mysql:8.4@sha256:5cdee9be17b6b7c804980be29d1bb0ba1536c7afaaed679fe0c1578ea0e3c233
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: cap
      MYSQL_USER: cap_user
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_ROOT_HOST: "%"
    command: ["--max_connections=1000"]
    volumes:
      - cap-mysql:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      timeout: 5s
      retries: 10

networks:
  default:
    name: cap_default

volumes:
  cap-mysql:

Verification Steps Performed

  1. S3 credentials are valid (tested with external S3 client - CyberDuck)
  2. Can successfully upload/download files to/from the Garage bucket using the same credentials
  3. Bucket "cap" exists and is accessible
  4. Cap reports "Created S3 bucket" on startup
  5. No files appear in the bucket after Cap upload

Questions

  1. Are there additional environment variables required for external S3 providers (non-AWS/MinIO)?
  2. Should there be upload-related logs that I'm not seeing? (Currently no logs during upload process)
  3. Is there a way to enable debug logging for S3 operations specifically?
  4. Does Cap require specific S3 API compatibility that Garage might not provide?

Thanks in advance!

Additional Notes

  • The official documentation and docker-compose template primarily shows MinIO configuration
  • Garage is S3-compatible and works with other S3 clients
  • The silent failure (no error logs) makes debugging difficult
  • Video metadata appears to be saved to the database (video ID is generated), but the actual video file is never uploaded to S3

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions