From 79a1ce05ef82009893de5e3a30e059354db6502d Mon Sep 17 00:00:00 2001 From: chetanr25 Date: Thu, 4 Jun 2026 01:10:06 +0530 Subject: [PATCH] chore: docker file and docker compose for prod envirnment --- docker/prod/Dockerfile | 37 +++++++++++++++++ docker/prod/compose.yml | 90 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 docker/prod/Dockerfile create mode 100644 docker/prod/compose.yml diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile new file mode 100644 index 0000000..8ad8dea --- /dev/null +++ b/docker/prod/Dockerfile @@ -0,0 +1,37 @@ +FROM python:3.11-slim AS builder + +WORKDIR /build + +COPY requirements.txt . +RUN pip install --no-cache-dir --prefix=/install -r requirements.txt + + +FROM python:3.11-slim + +WORKDIR /app + +RUN apt-get update && apt-get install -y \ + curl \ + libgl1 \ + libglib2.0-0 \ + libxcb1 \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=builder /install /usr/local + +# Copy only app code, not data/ temp/ tests/ docs/ etc. +COPY app/ ./app/ +COPY requirements.txt . + +ENV PYTHONPATH=/app + +# Data dirs created here; actual storage comes from mounted volumes at runtime. +RUN mkdir -p /data/db /data/uploads && chmod +x /entrypoint.sh + +EXPOSE 8000 + +CMD ["gunicorn", "app.main:app", \ + "--worker-class", "uvicorn.workers.UvicornWorker", \ + "--bind", "0.0.0.0:8000", \ + "--access-logfile", "-", \ + "--error-logfile", "-"] diff --git a/docker/prod/compose.yml b/docker/prod/compose.yml new file mode 100644 index 0000000..edd2fa4 --- /dev/null +++ b/docker/prod/compose.yml @@ -0,0 +1,90 @@ +services: + ollama: + image: ollama/ollama:latest + container_name: fireform-ollama + ports: + - "127.0.0.1:11434:11434" + volumes: + - ollama_data:/root/.ollama + networks: + - fireform-network + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "ollama list || exit 1"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s + + whisper: + image: onerahmet/openai-whisper-asr-webservice:latest + container_name: fireform-whisper + environment: + - ASR_ENGINE=faster_whisper + - ASR_MODEL=${WHISPER_MODEL} + - ASR_MODEL_PATH=/data/whisper + volumes: + - whisper_models:/data/whisper + ports: + - "127.0.0.1:9000:9000" + networks: + - fireform-network + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "python3 -c \"import urllib.request; urllib.request.urlopen('http://localhost:9000/docs')\" || exit 1"] + interval: 15s + timeout: 5s + retries: 5 + start_period: 60s + + app: + build: + context: ../.. + dockerfile: docker/prod/Dockerfile + container_name: fireform-app + depends_on: + ollama: + condition: service_healthy + whisper: + condition: service_started + command: ["gunicorn", "app.main:app", + "--worker-class", "uvicorn.workers.UvicornWorker", + "--bind", "0.0.0.0:8000", + "--access-logfile", "-", + "--error-logfile", "-"] + volumes: + - fireform_db:/data/db + - fireform_uploads:/data/uploads + ports: + - "${APP_PORT}:8000" + environment: + - PYTHONUNBUFFERED=1 + - CUDA_VISIBLE_DEVICES= + - PYTHONPATH=/app + - OLLAMA_HOST=${OLLAMA_HOST} + - OLLAMA_TIMEOUT=${OLLAMA_TIMEOUT} + - OLLAMA_MODEL=${OLLAMA_MODEL} + - WHISPER_HOST=${WHISPER_HOST} + - FIREFORM_DB_PATH=/data/db/fireform.db + - FIREFORM_DATA_DIR=/data/uploads + - FIREFORM_TEMPLATE_DIR=/data/uploads + - FIREFORM_DB_ECHO=false + - FRONTEND_ORIGINS=${FRONTEND_ORIGINS} + - WEB_CONCURRENCY=${GUNICORN_WORKERS} + networks: + - fireform-network + restart: unless-stopped + +volumes: + ollama_data: + driver: local + whisper_models: + driver: local + fireform_db: + driver: local + fireform_uploads: + driver: local + +networks: + fireform-network: + driver: bridge