Troubleshooting

Common issues and their fixes.

Multipart upload returns 403

Symptom: A large file upload fails with Request failed with status code 403 partway through.

  • Cause 1 — PRESIGNED_URL_BASE not set. The URL was signed against minio:9000 (internal) but the browser calls localhost:9000 (external), so the signature doesn't match.

    Fix: Set PRESIGNED_URL_BASE to the externally-reachable URL. See Uploading Objects.

  • Cause 2 — CORS not configured on storage. The browser preflight is rejected.

    Fix: MINIO_API_CORS_ALLOW_ORIGIN (MinIO) or a bucket CORS policy (S3). See CORS Setup.

Multipart upload completes but the file is corrupt

Cause: The frontend couldn't read ETag headers from part responses (CORS not exposing them), so it sent placeholders.

Fix: Ensure your CORS config has ExposeHeaders: ["ETag"]. See CORS Setup.

Audit log page is empty

Cause: The audit_logs table wasn't migrated.

Fix:

# Docker Compose
docker compose -f docker-compose.dev.yml exec backend alembic upgrade head

# Kubernetes
kubectl exec -it deploy/s3bear-backend -- alembic upgrade head

Copy / Move returns 403

Cause: Missing source read (and, for move, delete) or destination write permission.

Fix: Check the user's effective permissions in Groups — both the source and destination patterns must match a group the user belongs to. See Group Permissions.

Cause: The object isn't a recognized image MIME type — the image proxy is allow-listed by content-type.

Fix: This is intentional; the image proxy isn't a generic file server. For non-images, use public share links instead.

"User not approved" after Entra login

Cause: A first-time SSO user, but auto_create_users is false (the default).

Fix: Either flip auto_create_users to true in Settings, or pre-import the user via Entra User Import.


Related: Uploading Objects · CORS Setup · Configuration