parent
cfea84fd5e
commit
998180507c
|
@ -0,0 +1,232 @@
|
||||||
|
Leverage File Browser (GitHub URL: https://github.com/filebrowser/filebrowser) as the storage & HTTP API layer.
|
||||||
|
GitHub
|
||||||
|
|
||||||
|
Scaffold a React front-end that uses react-dropzone for drag-and-drop and Axios for uploads.
|
||||||
|
react-dropzone.js.org
|
||||||
|
Stack Overflow
|
||||||
|
|
||||||
|
Wire both services in a single docker-compose.yml; mount a named volume so anything dropped into File Browser instantly appears in the Library tab.
|
||||||
|
Docker Documentation
|
||||||
|
|
||||||
|
Expose File Browser’s REST endpoints (/api/files/:path, /api/raw/:path, /api/zip) to the React UI so you never touch the disk directly.
|
||||||
|
File Browser
|
||||||
|
GitHub
|
||||||
|
|
||||||
|
With that architecture, you can build, test and hand off a fully working micro-service before folding the code back into the larger project.
|
||||||
|
|
||||||
|
Stage 0 – Prerequisites & local toolchain
|
||||||
|
Install Docker Engine ≥ 24.x and Docker Compose v2 on every dev box.
|
||||||
|
|
||||||
|
Verify: docker --version and docker compose version.
|
||||||
|
Docker Documentation
|
||||||
|
|
||||||
|
Install Node 18 LTS and Yarn (or npm ≥ 10) for front-end builds.
|
||||||
|
|
||||||
|
Confirm ports 8080 (File Browser) and 5173 (Vite dev server) or 3000 (CRA dev server) are free.
|
||||||
|
|
||||||
|
Stage 1 – Project skeleton
|
||||||
|
text
|
||||||
|
Copy
|
||||||
|
Edit
|
||||||
|
podcaster-uploader/
|
||||||
|
├─ docker-compose.yml
|
||||||
|
├─ .env
|
||||||
|
├─ data/ ← will be bound to the named volume
|
||||||
|
└─ frontend/
|
||||||
|
Create the directory early; Compose will create the named volume but it helps to have a local data/ folder for inspection.
|
||||||
|
Docker Documentation
|
||||||
|
|
||||||
|
Stage 2 – Provision File Browser back-end
|
||||||
|
Add the service to docker-compose.yml:
|
||||||
|
|
||||||
|
yaml
|
||||||
|
Copy
|
||||||
|
Edit
|
||||||
|
services:
|
||||||
|
filebrowser:
|
||||||
|
image: filebrowser/filebrowser:latest # official image on Docker Hub
|
||||||
|
container_name: fb
|
||||||
|
volumes:
|
||||||
|
- pod_data:/srv # named volume
|
||||||
|
environment:
|
||||||
|
- PUID=1000 # host UID (non-root)
|
||||||
|
- PGID=1000 # host GID
|
||||||
|
ports:
|
||||||
|
- 8080:80 # UI & API
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
pod_data: # created automatically
|
||||||
|
Image details and environment flags come straight from the Docker Hub page.
|
||||||
|
Docker Hub
|
||||||
|
|
||||||
|
Run once in interactive mode to create the default admin user if you want non-public access:
|
||||||
|
docker exec -it fb filebrowser users add admin password --perm.admin
|
||||||
|
File Browser
|
||||||
|
|
||||||
|
Optional CORS: add --cors all to File Browser’s command if your React UI lives on a different host or port.
|
||||||
|
File Browser
|
||||||
|
|
||||||
|
Stage 3 – Scaffold the React front-end
|
||||||
|
Bootstrap with Vite or CRA (Vite is faster; substitute CRA if preferred):
|
||||||
|
|
||||||
|
bash
|
||||||
|
Copy
|
||||||
|
Edit
|
||||||
|
cd frontend
|
||||||
|
npm create vite@latest uploader --template react
|
||||||
|
cd uploader
|
||||||
|
npm install
|
||||||
|
Docker’s own blog shows an identical scaffold being dockerised later.
|
||||||
|
Docker
|
||||||
|
|
||||||
|
Add dependencies:
|
||||||
|
|
||||||
|
bash
|
||||||
|
Copy
|
||||||
|
Edit
|
||||||
|
npm i react-dropzone axios
|
||||||
|
react-dropzone supplies the drag-and-drop hooks; Axios handles multipart/form-data posts.
|
||||||
|
react-dropzone.js.org
|
||||||
|
Stack Overflow
|
||||||
|
|
||||||
|
Stage 4 – Implement the Upload tab
|
||||||
|
Create an <UploadPage> component that calls useDropzone(); accept audio/*.
|
||||||
|
|
||||||
|
On onDrop, build FormData:
|
||||||
|
|
||||||
|
js
|
||||||
|
Copy
|
||||||
|
Edit
|
||||||
|
const form = new FormData();
|
||||||
|
form.append('files', acceptedFile, acceptedFile.name);
|
||||||
|
await axios.post('/api/upload', form, { baseURL: import.meta.env.VITE_API });
|
||||||
|
Axios example follows the widely accepted pattern in community Q&A.
|
||||||
|
Stack Overflow
|
||||||
|
|
||||||
|
Point VITE_API to http://localhost:8080 in .env files for development; use the service name http://filebrowser when the React container runs inside Compose.
|
||||||
|
|
||||||
|
File Browser’s upload endpoint is POST /api/upload/:path?override=false; default path is root (/).
|
||||||
|
GitHub
|
||||||
|
|
||||||
|
Stage 5 – Implement the Library tab
|
||||||
|
Fetch directory listing with GET /api/files/:path (JSON).
|
||||||
|
File Browser
|
||||||
|
|
||||||
|
Render results in a table or grid (file name, size, modified date).
|
||||||
|
|
||||||
|
Each row’s download link hits GET /api/raw/:path for direct download/stream.
|
||||||
|
File Browser
|
||||||
|
|
||||||
|
For bulk downloads, File Browser supports GET /api/zip?files=/foo.mp3&files=/bar.wav.
|
||||||
|
File Browser
|
||||||
|
|
||||||
|
Because both Upload and Library talk only to the REST API, any file that already lives in /srv (the mounted volume) appears automatically—no extra code required.
|
||||||
|
|
||||||
|
Stage 6 – Containerise the front-end
|
||||||
|
Add a Dockerfile inside frontend/uploader/:
|
||||||
|
|
||||||
|
Dockerfile
|
||||||
|
|
||||||
|
# builder
|
||||||
|
FROM node:18-alpine AS build
|
||||||
|
WORKDIR /app
|
||||||
|
COPY . .
|
||||||
|
RUN npm ci && npm run build
|
||||||
|
|
||||||
|
# runner
|
||||||
|
FROM nginx:1.27-alpine
|
||||||
|
COPY --from=build /app/dist /usr/share/nginx/html
|
||||||
|
A multi-stage build keeps the final image tiny; the Nginx pattern mirrors the Docker guide.
|
||||||
|
Docker
|
||||||
|
|
||||||
|
Augment docker-compose.yml:
|
||||||
|
|
||||||
|
|
||||||
|
frontend:
|
||||||
|
build: ./frontend/uploader
|
||||||
|
container_name: ui
|
||||||
|
environment:
|
||||||
|
- VITE_API=http://filebrowser # internal host
|
||||||
|
depends_on:
|
||||||
|
- filebrowser
|
||||||
|
ports:
|
||||||
|
- 3000:80 # prod port
|
||||||
|
Stage 7 – Build & run
|
||||||
|
bash
|
||||||
|
Copy
|
||||||
|
Edit
|
||||||
|
docker compose build
|
||||||
|
docker compose up -d
|
||||||
|
Compose creates the pod_data volume only once; subsequent up commands reuse it, so stored audio survives container restarts.
|
||||||
|
Docker Documentation
|
||||||
|
|
||||||
|
Visit http://localhost:3000 → Upload tab → drag an .mp3.
|
||||||
|
Switch to Library → the file appears instantly; clicking downloads/streams it through File Browser’s /raw endpoint.
|
||||||
|
|
||||||
|
Stage 8 – Smoke tests & validation
|
||||||
|
CLI test:
|
||||||
|
curl -F "files=@sample.wav" http://localhost:8080/api/upload → expect {"event":"upload success"}.
|
||||||
|
GitHub
|
||||||
|
|
||||||
|
Large-file retry: pause network mid-upload; File Browser resumes automatically (uses TUS-like chunking).
|
||||||
|
File Browser
|
||||||
|
|
||||||
|
MIME filter: ensure React limits to audio/*; File Browser does server-side checks too.
|
||||||
|
File Browser
|
||||||
|
|
||||||
|
Stage 9 – Hardening & production tweaks
|
||||||
|
Concern Mitigation
|
||||||
|
Auth Create non-admin File Browser users; pass a JWT or session cookie from your SSO gateway.
|
||||||
|
File Browser
|
||||||
|
HTTPS Terminate TLS at your reverse-proxy (Traefik, Nginx, Caddy).
|
||||||
|
Back-ups Use docker run --rm -v pod_data:/data busybox tar czf /backup/pod_data.tgz /data.
|
||||||
|
Config as code Add filebrowser.json (users, branding) to the volume; File Browser consumes it at startup.
|
||||||
|
GitHub
|
||||||
|
|
||||||
|
Stage 10 – Integrate into the main project
|
||||||
|
Mount the same named volume in your legacy application containers; they can read the exact files File Browser writes.
|
||||||
|
|
||||||
|
Replace direct file-system access in the monolith with HTTP calls to /api/raw/:path if you’d rather not mount the volume.
|
||||||
|
|
||||||
|
CI/CD: build front-end and image in your existing pipeline; Compose file can be templated via Helm/Kustomize when you migrate to Kubernetes later.
|
||||||
|
|
||||||
|
Reference link requested
|
||||||
|
File Browser GitHub: https://github.com/filebrowser/filebrowser
|
||||||
|
GitHub
|
||||||
|
|
||||||
|
Key sources consulted (alphabetical by domain)
|
||||||
|
Docker Compose volume docs – volumes & reuse.
|
||||||
|
Docker Documentation
|
||||||
|
|
||||||
|
Docker Hub – official filebrowser/filebrowser image.
|
||||||
|
Docker Hub
|
||||||
|
|
||||||
|
File Browser project README & docs – endpoints, flags, CORS.
|
||||||
|
GitHub
|
||||||
|
File Browser
|
||||||
|
|
||||||
|
GitHub issue thread – confirmed upload API pattern.
|
||||||
|
GitHub
|
||||||
|
|
||||||
|
Medium / Docker blog – multi-stage React image build.
|
||||||
|
Docker
|
||||||
|
|
||||||
|
NPM & official site – react-dropzone usage.
|
||||||
|
react-dropzone.js.org
|
||||||
|
npm
|
||||||
|
|
||||||
|
RapidAPI / StackOverflow – Axios file-upload snippet.
|
||||||
|
Stack Overflow
|
||||||
|
RapidAPI
|
||||||
|
|
||||||
|
Reddit – practical explanation of named volumes.
|
||||||
|
Reddit
|
||||||
|
|
||||||
|
Docker Hub (alternative maintainer) – image size & variants.
|
||||||
|
Docker Hub
|
||||||
|
|
||||||
|
GitHub helper CLI for scripted uploads (optional).
|
||||||
|
GitHub
|
||||||
|
|
||||||
|
Hand this guide to the team, and they’ll have everything needed—from initial scaffold to production hardening—to deliver a clean, self-contained Upload + Library module that can be dropped into (or run alongside) your main application stack.
|
Loading…
Reference in New Issue