Full-stack self-hosted band rehearsal platform: Backend (FastAPI + SQLAlchemy 2.0 async): - Auth with JWT (register, login, /me, settings) - Band management with Nextcloud folder integration - Song management with audio version tracking - Nextcloud scan to auto-import audio files - Band membership with link-based invite system - Song comments - Audio analysis worker (BPM, key, loudness, waveform) - Nextcloud activity watcher for auto-import - WebSocket support for real-time annotation updates - Alembic migrations (0001–0003) - Repository pattern, Ruff + mypy configured Frontend (React 18 + Vite + TypeScript strict): - Login/register page with post-login redirect - Home page with band list and creation form - Band page with member panel, invite link, song list, NC scan - Song page with waveform player, annotations, comment thread - Settings page for per-user Nextcloud credentials - Invite acceptance page (/invite/:token) - ESLint v9 flat config + TypeScript strict mode Infrastructure: - Docker Compose: PostgreSQL, Redis, API, worker, watcher, nginx - nginx reverse proxy for static files + /api/ proxy - make check runs all linters before docker compose build Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
31 lines
1.1 KiB
Docker
31 lines
1.1 KiB
Docker
# Stage 1: Essentia builder
|
|
# Essentia doesn't have wheels for Python 3.12 yet; we use the official image
|
|
# and copy the bindings into our final stage via a bind mount.
|
|
FROM mtgupf/essentia:latest AS essentia-builder
|
|
|
|
FROM python:3.12-slim AS base
|
|
WORKDIR /app
|
|
|
|
# System dependencies for audio processing
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
ffmpeg \
|
|
libsndfile1 \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Copy Essentia Python bindings from builder (best-effort: no-op if the library
|
|
# wasn't built for this Python version or the path doesn't exist).
|
|
# COPY does not support shell redirections, so we use RUN --mount instead.
|
|
RUN --mount=type=bind,from=essentia-builder,source=/usr/local/lib,target=/essentia_lib \
|
|
find /essentia_lib -maxdepth 4 -name "essentia*" \
|
|
-exec cp -r {} /usr/local/lib/python3.12/site-packages/ \; \
|
|
2>/dev/null || true
|
|
|
|
RUN pip install uv
|
|
|
|
FROM base AS production
|
|
COPY pyproject.toml .
|
|
RUN uv sync --no-dev --frozen || uv sync --no-dev
|
|
COPY . .
|
|
ENV PYTHONPATH=/app/src
|
|
CMD ["uv", "run", "python", "-m", "worker.main"]
|