backend
Overview
Backend for the video upload prototype providing:
- Better Auth email/password authentication
- Presigned MinIO uploads/downloads
- An authenticated video administration surface at
/admin
Requirements
- Bun (tooling used for running scripts & dependency management)
- Postgres reachable via
DATABASE_URL - MinIO-compatible storage reachable via
MINIO_*env vars .envfile populated with secrets and credentials
Install
bun install
Configuration
Copy the example environment file and adjust the values:
cp .env.example .env
Required env vars:
| Name | Purpose |
|---|---|
DATABASE_URL |
Postgres connection string |
BETTER_AUTH_SECRET |
Secret used to sign sessions |
BETTER_AUTH_URL |
Public base URL for the backend (e.g., http://localhost:3000) |
BETTER_AUTH_TRUSTED_ORIGINS |
Comma-separated list of allowed frontend origins |
PORT |
HTTP port (default 3000) |
MINIO_* |
Connection settings for the MinIO/S3 endpoint |
ADMIN_USERNAME / ADMIN_PASSWORD |
Basic auth for /admin dashboard |
Running
- Start the server in development:
bun run dev
- Server boots after ensuring the configured MinIO bucket exists.
Database (Drizzle ORM)
- Generate a migration:
bun run db:generate - Apply migrations:
bun run db:migrate - Backfill Better Auth credential accounts for existing users:
bun run auth:migrate - Open Drizzle Studio:
bun run db:studio
API
All /videos and /admin routes require a valid Better Auth session except for the admin dashboard access, which uses HTTP Basic auth with ADMIN_USERNAME/ADMIN_PASSWORD.
Authentication
Authentication is handled by Better Auth under /api/auth/* (for example /api/auth/sign-in and /api/auth/sign-up).
Authorization
All authenticated endpoints expect a Better Auth session cookie sent by the client.
Video Management
| Endpoint | Purpose |
|---|---|
POST /videos/upload-url |
Request a presigned PUT URL for a new video |
GET /videos/download-url |
Generate a signed GET URL to download a video |
GET /videos |
List objects in the configured bucket |
DELETE /videos |
Delete an object by objectKey |
Admin Dashboard
Access /admin with Basic auth to:
- Request presigned upload URLs
- Upload files directly via the generated URL
- List and delete objects within the MinIO bucket
The dashboard UI submits to /admin/upload-url, /admin/objects, and /admin/object.
Schema
users– email/username/password and timestampsevents– user-created events with a uniquevideoUrlvideos– upload metadata includingobjectKey, bucket, URLs, status, and timestamps
Notes
- MinIO bucket creation happens during startup, so the service must be able to reach the endpoint.
- Keep Better Auth and MinIO secrets out of source control.