From 74be8307589f7cb2a9f714050f24d926dcfebee4 Mon Sep 17 00:00:00 2001 From: Mike Kell Date: Thu, 17 Jul 2025 20:16:38 -0400 Subject: [PATCH] initial backend development --- backend/Dockerfile | 21 +++++++++++++++++++++ backend/docker-compose.override.yml | 7 +++++++ backend/main.py | 28 ++++++++++++++++++++++++++++ backend/requirements.txt | 5 +++++ docker-compose.yml | 18 ++++++++++++++++++ 5 files changed, 79 insertions(+) create mode 100644 backend/Dockerfile create mode 100644 backend/docker-compose.override.yml create mode 100644 backend/main.py create mode 100644 backend/requirements.txt diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..54d0e6c --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,21 @@ +# Use official lightweight Python image +FROM python:3.11-slim + +# Set working directory inside container +WORKDIR /app + +# Install system dependencies +RUN apt-get update && apt-get install -y gcc libpq-dev curl && rm -rf /var/lib/apt/lists/* + +# Install Python dependencies +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +# Copy application code +COPY . . + +# Expose port for internal use (not mapped publicly unless via NGINX) +EXPOSE 8000 + +# Run the FastAPI app with Uvicorn +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/backend/docker-compose.override.yml b/backend/docker-compose.override.yml new file mode 100644 index 0000000..5bc86d4 --- /dev/null +++ b/backend/docker-compose.override.yml @@ -0,0 +1,7 @@ +version: '3.8' + +services: + complycore-api: + volumes: + - ./backend:/app + command: uvicorn main:app --host 0.0.0.0 --port 8000 --reload diff --git a/backend/main.py b/backend/main.py new file mode 100644 index 0000000..39c92dd --- /dev/null +++ b/backend/main.py @@ -0,0 +1,28 @@ +from sqlalchemy import create_engine +from dotenv import load_dotenv +import os + +# Load .env vars +load_dotenv() + +# Get env vars +USER = os.getenv("user") +PASSWORD = os.getenv("password") +HOST = os.getenv("host") +PORT = os.getenv("port") +DBNAME = os.getenv("dbname") + +# Full SQLAlchemy URI for Session Pooler +DATABASE_URL = ( + f"postgresql+psycopg2://{USER}:{PASSWORD}@{HOST}:{PORT}/{DBNAME}?sslmode=require" +) + +# Use NullPool to defer to Supabase's pooler +from sqlalchemy.pool import NullPool +engine = create_engine(DATABASE_URL, poolclass=NullPool) + +try: + with engine.connect() as conn: + print("✅ Supabase Session Pooler connection successful.") +except Exception as e: + print(f"❌ Connection failed: {e}") diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..a917863 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,5 @@ +fastapi==0.110.0 +uvicorn[standard]==0.27.1 +sqlalchemy==2.0.30 +psycopg2-binary==2.9.9 +python-dotenv==1.0.1 diff --git a/docker-compose.yml b/docker-compose.yml index e69de29..a39f052 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -0,0 +1,18 @@ + +services: + complycore-api: + build: + context: ./backend + container_name: complycore-api + restart: unless-stopped + env_file: + - ./backend/.env + networks: + - internal_only + expose: + - "8000" + + +networks: + internal_only: + driver: bridge