# Music Orchestrator Search → preview on YouTube → download as tagged MP3, organized for PlexAmp. ## Production deploy (Ubuntu server, local network) Copy the project to your Ubuntu machine, then: ```bash bash deploy.sh ``` The script installs all dependencies, builds the frontend, configures nginx and a systemd service, and starts everything. Re-run it at any time to apply updates. **Access:** `http://` from any device on your local network. ### After deploy ```bash # Stream live logs journalctl -u music-orchestrator@ -f # Restart the API sudo systemctl restart music-orchestrator@ # Change music library path nano /opt/music-orchestrator/backend/.env sudo systemctl restart music-orchestrator@ ``` --- ## Local development **Requirements:** Python 3.11+, Node 18+, ffmpeg ```bash # Backend cd backend python -m venv venv source venv/bin/activate pip install -r requirements.txt cp .env.example .env # set MUSIC_DIR uvicorn main:app --reload --port 8000 ``` ```bash # Frontend (separate terminal) cd frontend npm install npm run dev ``` Open `http://localhost:5173` — Vite proxies `/api` to the backend automatically. --- ## Music library structure Downloads are saved as: ``` Music/ └── Queen/ └── A Night at the Opera/ └── 01 - Bohemian Rhapsody.mp3 ``` Set `MUSIC_DIR` in `backend/.env` to your Plex library folder. ## Architecture notes - **1 uvicorn worker only** — download job state is held in memory. Multiple workers would each have their own job store, breaking status polling. - nginx serves the React build as static files and reverse-proxies `/api/*` to the FastAPI backend on `127.0.0.1:8000`. - Metadata (title, artist, album, artwork) comes from the iTunes Search API. The YouTube video is only used for audio.