ADD: Dockerize

This commit is contained in:
sebastian 2026-08-03 14:14:35 +02:00
parent 3483a7008c
commit fc9b8a8f22
6 changed files with 70 additions and 7 deletions

12
.idea/dataSources.xml Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="database.db" uuid="d39a7297-12f1-460d-940b-c994fe436bec">
<driver-ref>sqlite.xerial</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/database.db</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PySourceRootDetectionService">
<option name="sourcePathsSet">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>

13
Dockerfile Normal file
View File

@ -0,0 +1,13 @@
FROM python:3.12-slim
WORKDIR /app
# Erst nur requirements kopieren -> besseres Docker-Layer-Caching
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

10
db.py
View File

@ -1,10 +1,10 @@
from sqlalchemy import create_engine import os
from sqlmodel import SQLModel, Session from sqlmodel import create_engine, SQLModel, Session
from models.station import Station DATA_DIR = "data"
from models.measurement import IndoorMeasurement, OutdoorMeasurement os.makedirs(DATA_DIR, exist_ok=True)
engine = create_engine("sqlite:///database.db") engine = create_engine(f"sqlite:///{DATA_DIR}/database.db")
SQLModel.metadata.create_all(engine) SQLModel.metadata.create_all(engine)
def get_session(): def get_session():

View File

@ -2,6 +2,7 @@ import functools
from datetime import datetime from datetime import datetime
from typing import List from typing import List
import uvicorn
from fastapi import FastAPI, Depends, Query from fastapi import FastAPI, Depends, Query
from enum import Enum from enum import Enum
@ -19,7 +20,7 @@ from services import stationService, measurementService
app = FastAPI() app = FastAPI()
app.add_middleware( app.add_middleware(
CORSMiddleware, CORSMiddleware,
allow_origins=["http://localhost:4200"], allow_origins=["*"],
allow_credentials=True, allow_credentials=True,
allow_methods=["*"], allow_methods=["*"],
allow_headers=["*"], allow_headers=["*"],
@ -64,4 +65,7 @@ async def get_measurements(
@app.get('/measurements/records', response_model=RecordResponse, status_code=200) @app.get('/measurements/records', response_model=RecordResponse, status_code=200)
async def get_records(station_ids: list[int] | None = Query(default=None), from_timestamp: datetime | None = None, session: Session = Depends(get_session)): async def get_records(station_ids: list[int] | None = Query(default=None), from_timestamp: datetime | None = None, session: Session = Depends(get_session)):
return RecordResponse.model_validate(measurementService.get_measurement_records(session, station_ids, from_timestamp)) return RecordResponse.model_validate(measurementService.get_measurement_records(session, station_ids, from_timestamp))
if __name__ == "__main__":
uvicorn.run("main:app", host="0.0.0.0", port=8000)

24
requirements.txt Normal file
View File

@ -0,0 +1,24 @@
annotated-doc==0.0.4
annotated-types==0.7.0
anyio==4.14.1
certifi==2026.6.17
charset-normalizer==3.4.7
click==8.4.2
coolname==5.0.0
fastapi==0.138.1
greenlet==3.5.3
h11==0.16.0
httpcore==1.0.9
httpx==0.28.1
idna==3.18
pydantic==2.13.4
pydantic_core==2.46.4
requests==2.34.2
SQLAlchemy==2.0.51
sqlmodel==0.0.39
starlette==1.3.1
typing-inspection==0.4.2
typing_extensions==4.15.0
urllib3==2.7.0
utcnow==0.3.8
uvicorn==0.49.0