-
Notifications
You must be signed in to change notification settings - Fork 140
Add Environment Configuration Validator Script #238
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
c3d581b
edebc89
ad9d70b
b1eb51f
1f3fa9d
13e8aa4
14a7aa5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,51 @@ | ||||||||||||||
| name: Docker Build and Test | ||||||||||||||
|
|
||||||||||||||
| on: | ||||||||||||||
| push: | ||||||||||||||
| branches: [ main, develop ] | ||||||||||||||
| pull_request: | ||||||||||||||
| branches: [ main, develop ] | ||||||||||||||
|
|
||||||||||||||
| jobs: | ||||||||||||||
| build: | ||||||||||||||
| runs-on: ubuntu-latest | ||||||||||||||
|
|
||||||||||||||
| steps: | ||||||||||||||
| - name: Checkout code | ||||||||||||||
| uses: actions/checkout@v4 | ||||||||||||||
|
|
||||||||||||||
| - name: Set up Docker Buildx | ||||||||||||||
| uses: docker/setup-buildx-action@v3 | ||||||||||||||
|
|
||||||||||||||
| - name: Build Backend | ||||||||||||||
| run: | | ||||||||||||||
| cd Backend | ||||||||||||||
| docker build -t inpactai-backend:test . | ||||||||||||||
| - name: Build Frontend | ||||||||||||||
| run: | | ||||||||||||||
| cd Frontend | ||||||||||||||
| docker build -t inpactai-frontend:test . | ||||||||||||||
| - name: Start services | ||||||||||||||
| run: | | ||||||||||||||
| docker compose up -d | ||||||||||||||
| sleep 30 | ||||||||||||||
|
Comment on lines
+32
to
+34
|
||||||||||||||
| docker compose up -d | |
| sleep 30 | |
| docker compose up -d --wait | |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| __pycache__ | ||
| *.pyc | ||
| *.pyo | ||
| *.pyd | ||
| .Python | ||
| *.so | ||
| .env | ||
| .venv | ||
| env/ | ||
| venv/ | ||
| ENV/ | ||
| .git | ||
| .gitignore | ||
| .pytest_cache | ||
| .coverage | ||
| htmlcov/ | ||
| dist/ | ||
| build/ | ||
| *.egg-info/ | ||
| .DS_Store | ||
| *.log |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| user=postgres | ||
| password=your_postgres_password | ||
| host=your_postgres_host | ||
| port=5432 | ||
| dbname=postgres | ||
| GROQ_API_KEY=your_groq_api_key | ||
| SUPABASE_URL=your_supabase_url | ||
| SUPABASE_KEY=your_supabase_key | ||
| GEMINI_API_KEY=your_gemini_api_key | ||
| YOUTUBE_API_KEY=your_youtube_api_key | ||
| REDIS_HOST=redis | ||
| REDIS_PORT=6379 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| FROM python:3.10-slim | ||
|
|
||
| WORKDIR /app | ||
|
|
||
| RUN apt-get update && apt-get install -y --no-install-recommends \ | ||
| gcc \ | ||
| libpq-dev \ | ||
| curl \ | ||
| && rm -rf /var/lib/apt/lists/* | ||
|
|
||
| COPY requirements.txt . | ||
| RUN pip install --no-cache-dir -r requirements.txt | ||
|
|
||
| COPY . . | ||
|
|
||
| EXPOSE 8000 | ||
|
|
||
| CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"] |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,33 @@ | ||
| FROM python:3.10-slim AS builder | ||
|
|
||
| WORKDIR /app | ||
|
|
||
| RUN apt-get update && apt-get install -y --no-install-recommends \ | ||
| gcc \ | ||
| libpq-dev \ | ||
| && rm -rf /var/lib/apt/lists/* | ||
|
|
||
| COPY requirements.txt . | ||
| RUN pip install --no-cache-dir --user -r requirements.txt | ||
|
|
||
| FROM python:3.10-slim | ||
|
|
||
| WORKDIR /app | ||
|
|
||
| RUN apt-get update && apt-get install -y --no-install-recommends \ | ||
| libpq5 \ | ||
| && rm -rf /var/lib/apt/lists/* \ | ||
| && groupadd -r appuser && useradd -r -g appuser appuser | ||
|
|
||
| COPY --from=builder /root/.local /root/.local | ||
| COPY . . | ||
|
|
||
| RUN chown -R appuser:appuser /app | ||
|
|
||
| USER appuser | ||
|
|
||
| ENV PATH=/root/.local/bin:$PATH | ||
|
|
||
| EXPOSE 8000 | ||
|
|
||
| CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -1,5 +1,6 @@ | ||||||||||||||||||||||||||||
| from fastapi import FastAPI | ||||||||||||||||||||||||||||
| from fastapi import FastAPI, Request | ||||||||||||||||||||||||||||
| from fastapi.middleware.cors import CORSMiddleware | ||||||||||||||||||||||||||||
| from starlette.middleware.base import BaseHTTPMiddleware | ||||||||||||||||||||||||||||
| from .db.db import engine | ||||||||||||||||||||||||||||
| from .db.seed import seed_db | ||||||||||||||||||||||||||||
| from .models import models, chat | ||||||||||||||||||||||||||||
|
|
@@ -9,13 +10,21 @@ | |||||||||||||||||||||||||||
| from sqlalchemy.exc import SQLAlchemyError | ||||||||||||||||||||||||||||
| import logging | ||||||||||||||||||||||||||||
| import os | ||||||||||||||||||||||||||||
| import time | ||||||||||||||||||||||||||||
| from dotenv import load_dotenv | ||||||||||||||||||||||||||||
| from contextlib import asynccontextmanager | ||||||||||||||||||||||||||||
| from app.routes import ai | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| # Load environment variables | ||||||||||||||||||||||||||||
| load_dotenv() | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| # Configure logging | ||||||||||||||||||||||||||||
| logging.basicConfig( | ||||||||||||||||||||||||||||
| level=logging.INFO, | ||||||||||||||||||||||||||||
| format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' | ||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||
| logger = logging.getLogger(__name__) | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| # Async function to create database tables with exception handling | ||||||||||||||||||||||||||||
| async def create_tables(): | ||||||||||||||||||||||||||||
|
|
@@ -38,13 +47,42 @@ async def lifespan(app: FastAPI): | |||||||||||||||||||||||||||
| print("App is shutting down...") | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| # Custom middleware for logging and timing | ||||||||||||||||||||||||||||
| class RequestMiddleware(BaseHTTPMiddleware): | ||||||||||||||||||||||||||||
| async def dispatch(self, request: Request, call_next): | ||||||||||||||||||||||||||||
| start_time = time.time() | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| logger.info(f"Incoming: {request.method} {request.url.path}") | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| response = await call_next(request) | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| process_time = time.time() - start_time | ||||||||||||||||||||||||||||
| response.headers["X-Process-Time"] = str(process_time) | ||||||||||||||||||||||||||||
| response.headers["X-Content-Type-Options"] = "nosniff" | ||||||||||||||||||||||||||||
| response.headers["X-Frame-Options"] = "DENY" | ||||||||||||||||||||||||||||
| response.headers["X-XSS-Protection"] = "1; mode=block" | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
| response.headers["X-XSS-Protection"] = "1; mode=block" | |
| response.headers["X-XSS-Protection"] = "1; mode=block" | |
| response.headers["Strict-Transport-Security"] = "max-age=63072000; includeSubDomains; preload" | |
| response.headers["Content-Security-Policy"] = "default-src 'none';" |
Copilot
AI
Dec 13, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The CORS origins list includes redundant entries. "http://localhost:5173" appears on line 79 and "http://127.0.0.1:5173" on line 85, but these refer to the same host (localhost resolves to 127.0.0.1). Similarly, including multiple sequential ports (5173-5176) without clear documentation of why each is needed creates maintenance overhead. Consider documenting the purpose of each origin or consolidating to only necessary entries.
| allow_origins=[ | |
| "http://localhost:5173", | |
| "http://localhost:5174", | |
| "http://localhost:5175", | |
| "http://localhost:5176", | |
| "http://frontend:5173", | |
| "http://127.0.0.1:5173" | |
| # CORS origins for local development and Dockerized frontend. | |
| # Only include necessary ports. If you need to add more, document the reason. | |
| allow_origins=[ | |
| "http://localhost:5173", # Vite default dev server | |
| "http://localhost:5174", # Alternate dev server (if used) | |
| "http://frontend:5173", # Docker Compose frontend service |
| Original file line number | Diff line number | Diff line change | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -18,25 +18,37 @@ | |||||||||||||
| import uuid | ||||||||||||||
| from datetime import datetime, timezone | ||||||||||||||
|
|
||||||||||||||
| # Load environment variables | ||||||||||||||
| load_dotenv() | ||||||||||||||
| url: str = os.getenv("SUPABASE_URL") | ||||||||||||||
| key: str = os.getenv("SUPABASE_KEY") | ||||||||||||||
| supabase: Client = create_client(url, key) | ||||||||||||||
|
|
||||||||||||||
| url: str = os.getenv("SUPABASE_URL", "") | ||||||||||||||
| key: str = os.getenv("SUPABASE_KEY", "") | ||||||||||||||
|
|
||||||||||||||
| if not url or not key or "your-" in url: | ||||||||||||||
|
||||||||||||||
| if not url or not key or "your-" in url: | |
| if ( | |
| not url or not key or | |
| url.strip() == "your-supabase-url" or | |
| key.strip() == "your-supabase-key" | |
| ): |
Copilot
AI
Dec 13, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Print statement may execute during import.
Copilot
AI
Dec 13, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Print statement may execute during import.
Copilot
AI
Dec 13, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The error message in the check_supabase function has inconsistent capitalization. "Database service unavailable. Please configure Supabase credentials." should be "Database service unavailable. Please configure Supabase credentials" (remove period before secondary sentence or maintain consistent sentence structure).
| raise HTTPException(status_code=503, detail="Database service unavailable. Please configure Supabase credentials.") | |
| raise HTTPException(status_code=503, detail="Database service unavailable. Please configure Supabase credentials") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The workflow starts services with 'docker compose up -d' on line 32 but doesn't create or configure the required .env files first. The services will fail to start properly without valid environment configurations. Consider adding a step to create mock .env files with placeholder values, or document that this workflow requires repository secrets to be configured.