Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 0 additions & 28 deletions docker-compose.local.yml

This file was deleted.

File renamed without changes.
3 changes: 3 additions & 0 deletions server/auth_service/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.venv
__pycache__
.idea
Empty file added server/auth_service/.gitkeep
Empty file.
14 changes: 14 additions & 0 deletions server/auth_service/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
FROM python:3.13.3-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir fastapi[standard] && \
pip install --no-cache-dir -r requirements.txt

COPY . .

WORKDIR /app/src

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8002", "--reload"]
Empty file.
10 changes: 10 additions & 0 deletions server/auth_service/src/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import os
from abc import ABC
from dataclasses import asdict, dataclass


class CfgBase(ABC):
dict: callable = asdict

class PostgresCfg(CfgBase):
url: str = os.getenv("DATABASE_URL")
Empty file added server/auth_service/src/main.py
Empty file.
3 changes: 3 additions & 0 deletions server/data_service/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.venv
__pycache__
.idea
Empty file added server/data_service/.gitkeep
Empty file.
14 changes: 14 additions & 0 deletions server/data_service/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
FROM python:3.13.3-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir fastapi[standard] && \
pip install --no-cache-dir -r requirements.txt

COPY . .

WORKDIR /app/src

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8003", "--reload"]
Empty file.
10 changes: 10 additions & 0 deletions server/data_service/src/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import os
from abc import ABC
from dataclasses import asdict, dataclass


class CfgBase(ABC):
dict: callable = asdict

class PostgresCfg(CfgBase):
url: str = os.getenv("DATABASE_URL")
Empty file added server/data_service/src/main.py
Empty file.
83 changes: 83 additions & 0 deletions server/docker-compose.local.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
version: '3.8'

services:
gateway:
build: ./gateway
container_name: gateway
ports:
- "8001:8001"
depends_on:
- postgres
environment:
DATABASE_URL: postgresql+asyncpg://fastapi:secret@postgres:5432/fastapi_dev
restart: unless-stopped

auth_service:
build: ./auth_service
container_name: auth_service
ports:
- "8002:8002"
depends_on:
- postgres
environment:
DATABASE_URL: postgresql+asyncpg://fastapi:secret@postgres:5432/fastapi_dev
restart: unless-stopped

data_service:
build: ./data_service
container_name: data_service
ports:
- "8003:8003"
depends_on:
- postgres
environment:
DATABASE_URL: postgresql+asyncpg://fastapi:secret@postgres:5432/fastapi_dev
restart: unless-stopped

route_service:
build: ./route_service
container_name: route_service
ports:
- "8004:8004"
depends_on:
- postgres
environment:
DATABASE_URL: postgresql+asyncpg://fastapi:secret@postgres:5432/fastapi_dev
restart: unless-stopped

station_service:
build: ./station_service
container_name: station_service
ports:
- "8005:8005"
depends_on:
- postgres
environment:
DATABASE_URL: postgresql+asyncpg://fastapi:secret@postgres:5432/fastapi_dev
restart: unless-stopped

user_service:
build: ./user_service
container_name: user_service
ports:
- "8006:8006"
depends_on:
- postgres
environment:
DATABASE_URL: postgresql+asyncpg://fastapi:secret@postgres:5432/fastapi_dev
restart: unless-stopped

postgres:
image: postgres:15-alpine
container_name: postgres
environment:
POSTGRES_USER: fastapi
POSTGRES_PASSWORD: secret
POSTGRES_DB: fastapi_dev
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"

volumes:
postgres_data:
3 changes: 3 additions & 0 deletions server/gateway/.dockerignire
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.venv
.idea
__pycache__
Empty file added server/gateway/.gitkeep
Empty file.
14 changes: 14 additions & 0 deletions server/gateway/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
FROM python:3.13.3-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir fastapi[standard] && \
pip install --no-cache-dir -r requirements.txt

COPY . .

WORKDIR /app/src

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8001", "--reload"]
76 changes: 38 additions & 38 deletions requirements.txt → server/gateway/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,38 +1,38 @@
annotated-types==0.7.0
anyio==4.9.0
bcrypt==4.3.0
certifi==2025.4.26
click==8.1.8
colorama==0.4.6
dnspython==2.7.0
email_validator==2.2.0
fastapi==0.115.12
fastapi-cli==0.0.7
h11==0.16.0
httpcore==1.0.9
httptools==0.6.4
httpx==0.28.1
idna==3.10
Jinja2==3.1.6
markdown-it-py==3.0.0
MarkupSafe==3.0.2
mdurl==0.1.2
psycopg2==2.9.10
pydantic==2.11.4
pydantic_core==2.33.2
Pygments==2.19.1
PyJWT==2.10.1
python-dotenv==1.1.0
python-multipart==0.0.20
PyYAML==6.0.2
rich==14.0.0
rich-toolkit==0.14.6
shellingham==1.5.4
sniffio==1.3.1
starlette==0.46.2
typer==0.15.4
typing-inspection==0.4.0
typing_extensions==4.13.2
uvicorn==0.34.2
watchfiles==1.0.5
websockets==15.0.1
annotated-types==0.7.0
anyio==4.9.0
bcrypt==4.3.0
certifi==2025.4.26
click==8.1.8
colorama==0.4.6
dnspython==2.7.0
email_validator==2.2.0
fastapi==0.115.12
fastapi-cli==0.0.7
h11==0.16.0
httpcore==1.0.9
httptools==0.6.4
httpx==0.28.1
idna==3.10
Jinja2==3.1.6
markdown-it-py==3.0.0
MarkupSafe==3.0.2
mdurl==0.1.2
psycopg2==2.9.10
pydantic==2.11.4
pydantic_core==2.33.2
Pygments==2.19.1
PyJWT==2.10.1
python-dotenv==1.1.0
python-multipart==0.0.20
PyYAML==6.0.2
rich==14.0.0
rich-toolkit==0.14.6
shellingham==1.5.4
sniffio==1.3.1
starlette==0.46.2
typer==0.15.4
typing-inspection==0.4.0
typing_extensions==4.13.2
uvicorn==0.34.2
watchfiles==1.0.5
websockets==15.0.1
Empty file added server/gateway/src/__init__.py
Empty file.
10 changes: 10 additions & 0 deletions server/gateway/src/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import os
from abc import ABC
from dataclasses import asdict, dataclass


class CfgBase(ABC):
dict: callable = asdict

class PostgresCfg(CfgBase):
url: str = os.getenv("DATABASE_URL")
Empty file.
File renamed without changes.
83 changes: 42 additions & 41 deletions gateway/main.py → server/gateway/src/main.py
Original file line number Diff line number Diff line change
@@ -1,42 +1,43 @@
from fastapi import FastAPI, Depends, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
import logging
import uvicorn

from routers import auth, user, station, route

logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s"
)
logger = logging.getLogger(__name__)


app = FastAPI(title="EV Route Planner Gateway")

app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)

# Подключение маршрутов
app.include_router(auth.router, prefix="/auth")
app.include_router(user.router, prefix="/user")
app.include_router(station.router, prefix="/stations")
app.include_router(route.router, prefix="/route")
#app.include_router(data.router, prefix="/data")

@asynccontextmanager
async def lifespan(app: FastAPI):
logger.info("Gateway server is starting...")
yield
logger.info("Gateway server is shutting down...")


if __name__ == "__main__":
logger.info("Running with Uvicorn at http://0.0.0.0:8000")
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
import logging
import uvicorn

from server.gateway.src.routers import auth, route
from server.gateway.src.routers import user, station

logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s"
)
logger = logging.getLogger(__name__)


app = FastAPI(title="EV Route Planner Gateway")

app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)

# Подключение маршрутов
app.include_router(auth.router, prefix="/auth")
app.include_router(user.router, prefix="/user")
app.include_router(station.router, prefix="/stations")
app.include_router(route.router, prefix="/route")
#app.include_router(data.router, prefix="/data")

@asynccontextmanager
async def lifespan(app: FastAPI):
logger.info("Gateway server is starting...")
yield
logger.info("Gateway server is shutting down...")


if __name__ == "__main__":
logger.info("Running with Uvicorn at http://0.0.0.0:8000")
uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)
Empty file.
Loading