feat: Initialize Storyline AI Gateway project with a local run script and Docker configuration files.
This commit is contained in:
9
.dockerignore
Normal file
9
.dockerignore
Normal file
@@ -0,0 +1,9 @@
|
||||
venv/
|
||||
__pycache__/
|
||||
*.pyc
|
||||
.git/
|
||||
.env
|
||||
.ipynb_checkpoints/
|
||||
storyline.db
|
||||
*.log
|
||||
docker-compose.override.yml
|
||||
29
Dockerfile
Normal file
29
Dockerfile
Normal file
@@ -0,0 +1,29 @@
|
||||
# Use Python 3.12 slim image for a lightweight container
|
||||
FROM python:3.12-slim
|
||||
|
||||
# Set environment variables
|
||||
ENV PYTHONDONTWRITEBYTECODE=1
|
||||
ENV PYTHONUNBUFFERED=1
|
||||
ENV PORT=8000
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /app
|
||||
|
||||
# Install system dependencies
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
build-essential \
|
||||
libpq-dev \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install Python dependencies
|
||||
COPY requirements.txt .
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
# Copy the rest of the application
|
||||
COPY . .
|
||||
|
||||
# Expose the port the app runs on
|
||||
EXPOSE 8000
|
||||
|
||||
# Command to run the application using uvicorn
|
||||
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
||||
13
docker-compose.yml
Normal file
13
docker-compose.yml
Normal file
@@ -0,0 +1,13 @@
|
||||
services:
|
||||
api:
|
||||
build: .
|
||||
container_name: storyline-ai-gateway
|
||||
ports:
|
||||
- "8000:8000"
|
||||
env_file:
|
||||
- .env
|
||||
restart: always
|
||||
volumes:
|
||||
- .:/app
|
||||
# Override command for development/auto-reload if needed
|
||||
command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
|
||||
52
run.py
Normal file
52
run.py
Normal file
@@ -0,0 +1,52 @@
|
||||
import uvicorn
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
from dotenv import load_dotenv
|
||||
|
||||
def setup_environment():
|
||||
"""Ensure dependencies are installed and .env exists."""
|
||||
print("🚀 Initializing Storyline AI Gateway...")
|
||||
|
||||
# 1. Check for .env file
|
||||
if not os.path.exists(".env"):
|
||||
print("⚠️ Warning: .env file not found!")
|
||||
print("Please create a .env file based on the documentation.")
|
||||
|
||||
# 2. Check for virtual environment and install dependencies if requested
|
||||
if len(sys.argv) > 1 and sys.argv[1] == "--install":
|
||||
print("📦 Installing dependencies from requirements.txt...")
|
||||
try:
|
||||
subprocess.check_call([sys.executable, "-m", "pip", "install", "-r", "requirements.txt"])
|
||||
print("✅ Dependencies installed successfully.")
|
||||
except Exception as e:
|
||||
print(f"❌ Error installing dependencies: {e}")
|
||||
sys.exit(1)
|
||||
|
||||
def run_server():
|
||||
"""Start the FastAPI server."""
|
||||
load_dotenv()
|
||||
|
||||
# Configuration
|
||||
host = os.getenv("HOST", "0.0.0.0")
|
||||
port = int(os.getenv("PORT", 8000))
|
||||
# On a server, we usually don't want reload=True by default for performance
|
||||
# But for a 'test server', it might be useful.
|
||||
reload = os.getenv("DEBUG", "false").lower() == "true"
|
||||
|
||||
print(f"\n🌐 Gateway starting at http://{host}:{port}")
|
||||
print(f"🛠️ Admin Dashboard: http://{host}:{port}/admin")
|
||||
print(f"📚 API Docs: http://{host}:{port}/docs")
|
||||
print(f"🔄 Mode: {'Development (Reload On)' if reload else 'Production (Reload Off)'}\n")
|
||||
|
||||
uvicorn.run(
|
||||
"app.main:app",
|
||||
host=host,
|
||||
port=port,
|
||||
reload=reload,
|
||||
workers=1 if reload else 4 # Multi-worker for production
|
||||
)
|
||||
|
||||
if __name__ == "__main__":
|
||||
setup_environment()
|
||||
run_server()
|
||||
Reference in New Issue
Block a user