initial backend development

This commit is contained in:
Mike Kell 2025-07-17 20:16:38 -04:00
parent 9048691ce1
commit 74be830758
5 changed files with 79 additions and 0 deletions

21
backend/Dockerfile Normal file
View File

@ -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"]

View File

@ -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

28
backend/main.py Normal file
View File

@ -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}")

5
backend/requirements.txt Normal file
View File

@ -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

View File

@ -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