Add Railway deployment configuration
- Add Dockerfiles for backend (FastAPI) and frontend (nginx) - Add railway.toml configs with health checks - Add .dockerignore files for optimized builds - Update config.py to auto-convert Railway DATABASE_URL format - Add FRONTEND_URL env var for production CORS Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
from pydantic_settings import BaseSettings
|
||||
from pydantic import field_validator
|
||||
from typing import Optional
|
||||
|
||||
|
||||
@@ -8,10 +9,26 @@ class Settings(BaseSettings):
|
||||
DEBUG: bool = False
|
||||
API_V1_PREFIX: str = "/api/v1"
|
||||
|
||||
# Database
|
||||
# Database - Railway provides DATABASE_URL, we convert it for asyncpg
|
||||
DATABASE_URL: str = "postgresql+asyncpg://postgres:postgres@localhost:5432/patherly"
|
||||
DATABASE_URL_SYNC: str = "postgresql://postgres:postgres@localhost:5432/patherly"
|
||||
|
||||
@field_validator("DATABASE_URL", mode="before")
|
||||
@classmethod
|
||||
def convert_database_url(cls, v: str) -> str:
|
||||
"""Convert standard postgres URL to asyncpg format."""
|
||||
if v.startswith("postgresql://"):
|
||||
return v.replace("postgresql://", "postgresql+asyncpg://", 1)
|
||||
return v
|
||||
|
||||
@field_validator("DATABASE_URL_SYNC", mode="before")
|
||||
@classmethod
|
||||
def ensure_sync_url(cls, v: str) -> str:
|
||||
"""Ensure sync URL uses standard postgresql prefix."""
|
||||
if v.startswith("postgresql+asyncpg://"):
|
||||
return v.replace("postgresql+asyncpg://", "postgresql://", 1)
|
||||
return v
|
||||
|
||||
# JWT Settings
|
||||
SECRET_KEY: str = "your-secret-key-change-in-production-use-openssl-rand-hex-32"
|
||||
ALGORITHM: str = "HS256"
|
||||
@@ -21,8 +38,17 @@ class Settings(BaseSettings):
|
||||
# Security
|
||||
BCRYPT_ROUNDS: int = 12
|
||||
|
||||
# CORS
|
||||
# CORS - set FRONTEND_URL in production (e.g., https://patherly.up.railway.app)
|
||||
CORS_ORIGINS: list[str] = ["http://localhost:3000", "http://localhost:5173", "http://localhost:5174"]
|
||||
FRONTEND_URL: Optional[str] = None
|
||||
|
||||
@property
|
||||
def allowed_origins(self) -> list[str]:
|
||||
"""Get all allowed CORS origins including FRONTEND_URL if set."""
|
||||
origins = self.CORS_ORIGINS.copy()
|
||||
if self.FRONTEND_URL and self.FRONTEND_URL not in origins:
|
||||
origins.append(self.FRONTEND_URL)
|
||||
return origins
|
||||
|
||||
class Config:
|
||||
env_file = ".env"
|
||||
|
||||
Reference in New Issue
Block a user