Phase 1 implementation with ngspice backend and Astro/React frontend: Backend (FastAPI): - ngspice subprocess engine with custom .raw file parser - Notebook CRUD with .spicebook JSON format (filesystem storage) - Simulation endpoints (standalone + cell-in-notebook) - SVG waveform export endpoint - 18 REST API routes, 5 passing tests Frontend (Astro 5 + React 19): - Notebook editor as React island with Zustand state management - CodeMirror 6 with custom SPICE language mode (syntax highlighting for dot commands, components, engineering notation, comments) - uPlot waveform viewer with transient and AC/Bode plot modes - Markdown cells with edit/preview toggle - Notebook list with card grid UI - Dark theme, Tailwind CSS 4, Lucide icons Infrastructure: - Docker Compose with dev/prod targets - Caddy-based frontend prod serving - 3 example notebooks (RC filter, voltage divider, CE amplifier)
55 lines
1.7 KiB
Docker
55 lines
1.7 KiB
Docker
FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim AS base
|
|
|
|
# System dependencies -- ngspice is required for simulation
|
|
RUN apt-get update && \
|
|
apt-get install -y --no-install-recommends ngspice && \
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
WORKDIR /app
|
|
|
|
# Copy dependency metadata first for layer caching
|
|
COPY pyproject.toml ./
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Development target
|
|
# ---------------------------------------------------------------------------
|
|
FROM base AS dev
|
|
|
|
# Install in editable mode (source mounted via docker-compose volume)
|
|
RUN --mount=type=cache,target=/root/.cache/uv \
|
|
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
|
|
uv pip install --system -e ".[dev]"
|
|
|
|
# Copy source for initial build (overridden by volume mount in dev)
|
|
COPY src/ ./src/
|
|
|
|
EXPOSE 8000
|
|
|
|
CMD ["uv", "run", "uvicorn", "spicebook.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Production target
|
|
# ---------------------------------------------------------------------------
|
|
FROM base AS prod
|
|
|
|
ENV UV_COMPILE_BYTECODE=1
|
|
|
|
# Install dependencies first (no source yet -- better caching)
|
|
RUN --mount=type=cache,target=/root/.cache/uv \
|
|
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
|
|
uv pip install --system --no-editable .
|
|
|
|
COPY src/ ./src/
|
|
|
|
# Re-install with source to get the package registered
|
|
RUN --mount=type=cache,target=/root/.cache/uv \
|
|
uv pip install --system --no-editable .
|
|
|
|
# Run as non-root
|
|
RUN useradd --create-home --shell /bin/bash spicebook
|
|
USER spicebook
|
|
|
|
EXPOSE 8000
|
|
|
|
CMD ["python", "-m", "uvicorn", "spicebook.main:app", "--host", "0.0.0.0", "--port", "8000"]
|