feat: add single-image compose deliverable and CI
Some checks are pending
ci / backend (push) Waiting to run
ci / frontend (push) Waiting to run

This commit is contained in:
Justin Visser 2026-08-09 20:59:58 +02:00
parent b354b0be76
commit d2380b621a
4 changed files with 70 additions and 0 deletions

4
.env.example Normal file
View file

@ -0,0 +1,4 @@
# Copy to .env and adjust. Without a .env the app starts in demo mode.
# Credential variables get added here as the features that need them land.
APP_MODE=demo

38
.github/workflows/ci.yml vendored Normal file
View file

@ -0,0 +1,38 @@
name: ci
on:
push:
branches: [main]
pull_request:
jobs:
backend:
runs-on: ubuntu-latest
defaults:
run:
working-directory: backend
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v5
- run: uv sync --frozen
- run: uv run ruff check .
- run: uv run ruff format --check .
- run: uv run mypy app
- run: uv run pytest
frontend:
runs-on: ubuntu-latest
defaults:
run:
working-directory: frontend
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: frontend/package-lock.json
- run: npm ci
- run: npm run typecheck
- run: npm run lint
- run: npm run build

16
backend/Dockerfile Normal file
View file

@ -0,0 +1,16 @@
# Build context is the repository root: one image serves API + built SPA.
FROM node:20-slim AS frontend
WORKDIR /build
COPY frontend/package.json frontend/package-lock.json ./
RUN npm ci
COPY frontend/ ./
RUN npm run build
FROM ghcr.io/astral-sh/uv:python3.13-bookworm-slim
WORKDIR /srv
COPY backend/pyproject.toml backend/uv.lock ./
RUN uv sync --frozen --no-dev --no-install-project
COPY backend/app ./app
COPY --from=frontend /build/dist ./app/static
EXPOSE 8000
CMD ["uv", "run", "--no-sync", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

12
docker-compose.yml Normal file
View file

@ -0,0 +1,12 @@
services:
app:
build:
context: .
dockerfile: backend/Dockerfile
env_file:
- path: .env
required: false
ports:
# host port is fixed: the registered Spotify redirect URI
# (http://127.0.0.1:8888/callback) must match exactly
- "127.0.0.1:8888:8000"