forked from 0xWheatyz/SPARC
feat: update Docker config to run API and dashboard services
- Switch from Alpine to Debian slim for better package compatibility - Add system dependencies for pdfplumber and psycopg2 - Configure separate services for API (port 8000) and dashboard (port 8501) - Add automatic database initialization via init-db service - Update documentation with simplified Docker setup - Remove need for separate docker-compose.prod.yml 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
+15
-2
@@ -1,12 +1,25 @@
|
|||||||
FROM python:3.14-alpine3.23
|
FROM python:3.12-slim
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Install system dependencies for pdfplumber and psycopg2
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
gcc \
|
||||||
|
libpq-dev \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
COPY requirements.txt .
|
COPY requirements.txt .
|
||||||
|
|
||||||
RUN pip install --no-cache-dir -r requirements.txt
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
CMD ["python3", "main.py"]
|
# Create patents directory for PDF storage
|
||||||
|
RUN mkdir -p /app/patents
|
||||||
|
|
||||||
|
# Expose ports for API and Dashboard
|
||||||
|
EXPOSE 8000 8501
|
||||||
|
|
||||||
|
# Default command runs the API (can be overridden in docker-compose)
|
||||||
|
CMD ["uvicorn", "SPARC.api:app", "--host", "0.0.0.0", "--port", "8000"]
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,25 @@ SPARC/
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
### NixOS (Recommended)
|
### Docker (Recommended)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Clone and configure
|
||||||
|
git clone <repository-url>
|
||||||
|
cd SPARC
|
||||||
|
cp .env.example .env
|
||||||
|
# Edit .env with your API keys
|
||||||
|
|
||||||
|
# Start all services (API, Dashboard, PostgreSQL)
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# Access the services
|
||||||
|
# - API: http://localhost:8000
|
||||||
|
# - Dashboard: http://localhost:8501
|
||||||
|
# - API Docs: http://localhost:8000/docs
|
||||||
|
```
|
||||||
|
|
||||||
|
### NixOS
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
nix develop
|
nix develop
|
||||||
@@ -262,4 +280,4 @@ For open source projects, say how it is licensed.
|
|||||||
|
|
||||||
Core functionality complete. Ready for production use with API keys configured.
|
Core functionality complete. Ready for production use with API keys configured.
|
||||||
|
|
||||||
Next steps: API wrapper, containerization, and multi-company support.
|
All major features implemented: REST API, Streamlit dashboard, Docker containerization, database storage, and multi-company batch processing.
|
||||||
|
|||||||
+42
-8
@@ -12,25 +12,59 @@ services:
|
|||||||
- postgres_data:/var/lib/postgresql/data
|
- postgres_data:/var/lib/postgresql/data
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
||||||
interval: 10s
|
interval: 5s
|
||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 5
|
retries: 5
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
app:
|
init-db:
|
||||||
build:
|
build: .
|
||||||
context: .
|
container_name: sparc-init-db
|
||||||
dockerfile: Dockerfile
|
command: python scripts/init_database.py
|
||||||
container_name: sparc-app
|
environment:
|
||||||
|
DATABASE_URL: postgresql://postgres:postgres@postgres:5432/sparc
|
||||||
|
USE_DATABASE: "true"
|
||||||
depends_on:
|
depends_on:
|
||||||
postgres:
|
postgres:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
restart: "no"
|
||||||
|
|
||||||
|
api:
|
||||||
|
build: .
|
||||||
|
container_name: sparc-api
|
||||||
|
command: uvicorn SPARC.api:app --host 0.0.0.0 --port 8000
|
||||||
environment:
|
environment:
|
||||||
USE_DATABASE: true
|
API_KEY: ${API_KEY}
|
||||||
|
OPENROUTER_API_KEY: ${OPENROUTER_API_KEY}
|
||||||
DATABASE_URL: postgresql://postgres:postgres@postgres:5432/sparc
|
DATABASE_URL: postgresql://postgres:postgres@postgres:5432/sparc
|
||||||
|
USE_DATABASE: "true"
|
||||||
ports:
|
ports:
|
||||||
- "8000:8000"
|
- "8000:8000"
|
||||||
|
depends_on:
|
||||||
|
postgres:
|
||||||
|
condition: service_healthy
|
||||||
|
init-db:
|
||||||
|
condition: service_completed_successfully
|
||||||
volumes:
|
volumes:
|
||||||
- .:/app
|
- ./patents:/app/patents
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
dashboard:
|
||||||
|
build: .
|
||||||
|
container_name: sparc-dashboard
|
||||||
|
command: streamlit run dashboard.py --server.port 8501 --server.address 0.0.0.0
|
||||||
|
environment:
|
||||||
|
API_KEY: ${API_KEY}
|
||||||
|
OPENROUTER_API_KEY: ${OPENROUTER_API_KEY}
|
||||||
|
DATABASE_URL: postgresql://postgres:postgres@postgres:5432/sparc
|
||||||
|
USE_DATABASE: "true"
|
||||||
|
ports:
|
||||||
|
- "8501:8501"
|
||||||
|
depends_on:
|
||||||
|
- api
|
||||||
|
volumes:
|
||||||
|
- ./patents:/app/patents
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
postgres_data:
|
postgres_data:
|
||||||
|
|||||||
+62
-106
@@ -55,28 +55,25 @@ USE_DATABASE=true
|
|||||||
## Step 2: Start Services with Docker Compose
|
## Step 2: Start Services with Docker Compose
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Start PostgreSQL database
|
# Start all services (PostgreSQL, API, and Dashboard)
|
||||||
docker-compose up -d postgres
|
docker-compose up -d
|
||||||
|
|
||||||
# Wait for postgres to be healthy (check with)
|
# Check status
|
||||||
docker-compose ps
|
docker-compose ps
|
||||||
|
|
||||||
# You should see sparc-postgres with status "healthy"
|
# You should see:
|
||||||
|
# - sparc-postgres (healthy)
|
||||||
|
# - sparc-api (running on port 8000)
|
||||||
|
# - sparc-dashboard (running on port 8501)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
The database is automatically initialized by the `init-db` service.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Step 3: Initialize the Database
|
## Step 3: Database Schema
|
||||||
|
|
||||||
```bash
|
The `init-db` service automatically creates the `llm_messages` table with the following schema:
|
||||||
# Option A: If running locally with Python
|
|
||||||
python scripts/init_database.py
|
|
||||||
|
|
||||||
# Option B: If using Docker, run inside container
|
|
||||||
docker-compose run --rm sparc-app python scripts/init_database.py
|
|
||||||
```
|
|
||||||
|
|
||||||
This creates the `llm_messages` table with the following schema:
|
|
||||||
|
|
||||||
| Column | Type | Purpose |
|
| Column | Type | Purpose |
|
||||||
|--------|------|---------|
|
|--------|------|---------|
|
||||||
@@ -95,9 +92,30 @@ This creates the `llm_messages` table with the following schema:
|
|||||||
|
|
||||||
## Step 4: Run the Services
|
## Step 4: Run the Services
|
||||||
|
|
||||||
### Option A: Run Locally (Development)
|
### Option A: Run with Docker Compose (Recommended)
|
||||||
|
|
||||||
|
All services are started automatically with `docker-compose up -d` from Step 2.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
# View logs
|
||||||
|
docker-compose logs -f
|
||||||
|
|
||||||
|
# View specific service logs
|
||||||
|
docker-compose logs -f api
|
||||||
|
docker-compose logs -f dashboard
|
||||||
|
```
|
||||||
|
|
||||||
|
### Option B: Run Locally (Development)
|
||||||
|
|
||||||
|
If you prefer running services locally without Docker:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start PostgreSQL with Docker
|
||||||
|
docker-compose up -d postgres
|
||||||
|
|
||||||
|
# Wait for database to be healthy, then initialize
|
||||||
|
python scripts/init_database.py
|
||||||
|
|
||||||
# Terminal 1: Start FastAPI backend
|
# Terminal 1: Start FastAPI backend
|
||||||
uvicorn SPARC.api:app --host 0.0.0.0 --port 8000 --reload
|
uvicorn SPARC.api:app --host 0.0.0.0 --port 8000 --reload
|
||||||
|
|
||||||
@@ -105,14 +123,6 @@ uvicorn SPARC.api:app --host 0.0.0.0 --port 8000 --reload
|
|||||||
streamlit run dashboard.py --server.port 8501 --server.address 0.0.0.0
|
streamlit run dashboard.py --server.port 8501 --server.address 0.0.0.0
|
||||||
```
|
```
|
||||||
|
|
||||||
### Option B: Run with Docker (Production)
|
|
||||||
|
|
||||||
See [Production Docker Compose](#production-docker-compose) section below for a complete `docker-compose.prod.yml` configuration.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose -f docker-compose.prod.yml up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Step 5: Verify Deployment
|
## Step 5: Verify Deployment
|
||||||
@@ -256,97 +266,41 @@ postgresql://postgres:postgres@localhost:5432/sparc
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Production Docker Compose
|
## Docker Compose Services
|
||||||
|
|
||||||
Create a `docker-compose.prod.yml` file for full production deployment:
|
The `docker-compose.yml` includes all services needed for production:
|
||||||
|
|
||||||
```yaml
|
| Service | Container | Port | Description |
|
||||||
version: '3.8'
|
|---------|-----------|------|-------------|
|
||||||
|
| `postgres` | sparc-postgres | 5432 | PostgreSQL database |
|
||||||
|
| `init-db` | sparc-init-db | - | One-time database initialization |
|
||||||
|
| `api` | sparc-api | 8000 | FastAPI REST API |
|
||||||
|
| `dashboard` | sparc-dashboard | 8501 | Streamlit web UI |
|
||||||
|
|
||||||
services:
|
### Common Docker Compose Commands
|
||||||
postgres:
|
|
||||||
image: postgres:16-alpine
|
|
||||||
container_name: sparc-postgres
|
|
||||||
environment:
|
|
||||||
POSTGRES_USER: postgres
|
|
||||||
POSTGRES_PASSWORD: postgres
|
|
||||||
POSTGRES_DB: sparc
|
|
||||||
volumes:
|
|
||||||
- postgres_data:/var/lib/postgresql/data
|
|
||||||
ports:
|
|
||||||
- "5432:5432"
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
|
||||||
interval: 5s
|
|
||||||
timeout: 5s
|
|
||||||
retries: 5
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
api:
|
|
||||||
build: .
|
|
||||||
container_name: sparc-api
|
|
||||||
command: uvicorn SPARC.api:app --host 0.0.0.0 --port 8000
|
|
||||||
environment:
|
|
||||||
- API_KEY=${API_KEY}
|
|
||||||
- OPENROUTER_API_KEY=${OPENROUTER_API_KEY}
|
|
||||||
- DATABASE_URL=postgresql://postgres:postgres@postgres:5432/sparc
|
|
||||||
- USE_DATABASE=true
|
|
||||||
ports:
|
|
||||||
- "8000:8000"
|
|
||||||
depends_on:
|
|
||||||
postgres:
|
|
||||||
condition: service_healthy
|
|
||||||
volumes:
|
|
||||||
- ./patents:/app/patents
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
dashboard:
|
|
||||||
build: .
|
|
||||||
container_name: sparc-dashboard
|
|
||||||
command: streamlit run dashboard.py --server.port 8501 --server.address 0.0.0.0
|
|
||||||
environment:
|
|
||||||
- API_KEY=${API_KEY}
|
|
||||||
- OPENROUTER_API_KEY=${OPENROUTER_API_KEY}
|
|
||||||
- DATABASE_URL=postgresql://postgres:postgres@postgres:5432/sparc
|
|
||||||
- USE_DATABASE=true
|
|
||||||
ports:
|
|
||||||
- "8501:8501"
|
|
||||||
depends_on:
|
|
||||||
- api
|
|
||||||
volumes:
|
|
||||||
- ./patents:/app/patents
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
init-db:
|
|
||||||
build: .
|
|
||||||
container_name: sparc-init-db
|
|
||||||
command: python scripts/init_database.py
|
|
||||||
environment:
|
|
||||||
- DATABASE_URL=postgresql://postgres:postgres@postgres:5432/sparc
|
|
||||||
- USE_DATABASE=true
|
|
||||||
depends_on:
|
|
||||||
postgres:
|
|
||||||
condition: service_healthy
|
|
||||||
restart: "no"
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
postgres_data:
|
|
||||||
```
|
|
||||||
|
|
||||||
### Deploy with Production Compose
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Start all services
|
# Start all services
|
||||||
docker-compose -f docker-compose.prod.yml up -d
|
docker-compose up -d
|
||||||
|
|
||||||
|
# Start with rebuild (after code changes)
|
||||||
|
docker-compose up -d --build
|
||||||
|
|
||||||
# View logs
|
# View logs
|
||||||
docker-compose -f docker-compose.prod.yml logs -f
|
docker-compose logs -f
|
||||||
|
|
||||||
|
# View specific service logs
|
||||||
|
docker-compose logs -f api
|
||||||
|
docker-compose logs -f dashboard
|
||||||
|
|
||||||
# Stop all services
|
# Stop all services
|
||||||
docker-compose -f docker-compose.prod.yml down
|
docker-compose down
|
||||||
|
|
||||||
# Stop and remove volumes (WARNING: deletes data)
|
# Stop and remove volumes (WARNING: deletes data)
|
||||||
docker-compose -f docker-compose.prod.yml down -v
|
docker-compose down -v
|
||||||
|
|
||||||
|
# Restart a specific service
|
||||||
|
docker-compose restart api
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -417,7 +371,12 @@ docker-compose logs -f dashboard
|
|||||||
## Quick Reference
|
## Quick Reference
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Development setup
|
# Docker setup (recommended)
|
||||||
|
cp .env.example .env
|
||||||
|
# Edit .env with API keys
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# Local development setup
|
||||||
cp .env.example .env
|
cp .env.example .env
|
||||||
# Edit .env with API keys
|
# Edit .env with API keys
|
||||||
docker-compose up -d postgres
|
docker-compose up -d postgres
|
||||||
@@ -425,9 +384,6 @@ python scripts/init_database.py
|
|||||||
uvicorn SPARC.api:app --reload &
|
uvicorn SPARC.api:app --reload &
|
||||||
streamlit run dashboard.py
|
streamlit run dashboard.py
|
||||||
|
|
||||||
# Production setup
|
|
||||||
docker-compose -f docker-compose.prod.yml up -d
|
|
||||||
|
|
||||||
# Check status
|
# Check status
|
||||||
curl http://localhost:8000/health
|
curl http://localhost:8000/health
|
||||||
open http://localhost:8501
|
open http://localhost:8501
|
||||||
|
|||||||
Reference in New Issue
Block a user