-
Notifications
You must be signed in to change notification settings - Fork 139
Enhance Environment Configuration Validator Script #240
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
90f649e
1a27acb
a39b53f
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 | ||
| - name: Check backend health | ||
| run: | | ||
| curl -f http://localhost:8000/ || exit 1 | ||
| - name: Check frontend health | ||
| run: | | ||
| curl -f http://localhost:5173/ || exit 1 | ||
| - name: Show logs on failure | ||
| if: failure() | ||
| run: | | ||
| docker compose logs | ||
| - name: Cleanup | ||
| if: always() | ||
| run: | | ||
| docker compose down -v | ||
| 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" | ||||
|
|
||||
| logger.info(f"Completed: {request.method} {request.url.path} - {response.status_code} ({process_time:.3f}s)") | ||||
|
|
||||
| return response | ||||
|
|
||||
| # Initialize FastAPI | ||||
| app = FastAPI(lifespan=lifespan) | ||||
|
|
||||
| # Add custom middleware | ||||
| app.add_middleware(RequestMiddleware) | ||||
|
|
||||
| # Add CORS middleware | ||||
| app.add_middleware( | ||||
| CORSMiddleware, | ||||
| allow_origins=["http://localhost:5173"], | ||||
| allow_origins=[ | ||||
| "http://localhost:5173", | ||||
| "http://localhost:5174", | ||||
| "http://localhost:5175", | ||||
| "http://localhost:5176", | ||||
| "http://frontend:5173", | ||||
|
||||
| "http://frontend:5173", |
| 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", "") | ||||||||||||
|
Comment on lines
+23
to
+24
|
||||||||||||
| url: str = os.getenv("SUPABASE_URL", "") | |
| key: str = os.getenv("SUPABASE_KEY", "") | |
| url: str = os.getenv("SUPABASE_URL") | |
| key: str = os.getenv("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.
The check 'your-' with a hyphen is inconsistent with the placeholder format used in the Backend/.env.example file which uses underscores ('your_'). This inconsistency may cause the validation to miss actual placeholder values or incorrectly flag legitimate URLs.
| if not url or not key or "your-" in url: | |
| if not url or not key or "your_" in url: |
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 print statements use console output (print, echo) instead of proper logging, which would provide timestamps and log levels. For a production application with middleware logging already configured, these ad-hoc print statements create inconsistent logging output and make it difficult to filter or control log verbosity.
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 'Database service unavailable' is generic and doesn't provide clear guidance to the user. Since the actual issue is missing Supabase credentials (not a database being down), the message should be more specific, such as 'Supabase credentials not configured. Please set SUPABASE_URL and SUPABASE_KEY in Backend/.env'.
| raise HTTPException(status_code=503, detail="Database service unavailable. Please configure Supabase credentials.") | |
| raise HTTPException( | |
| status_code=503, | |
| detail="Supabase credentials not configured. Please set SUPABASE_URL and SUPABASE_KEY in Backend/.env" | |
| ) |
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 GitHub Actions workflow will fail during the 'Start services' step because it attempts to run 'docker compose up -d' without first creating the required .env files. The Backend/.env and Frontend/.env files are listed in .dockerignore and .gitignore, so they won't be present in the CI environment, causing the services to fail to start.