diff --git a/Dockerfile.api b/Dockerfile.api index 78a1bc4..ef3a7b3 100644 --- a/Dockerfile.api +++ b/Dockerfile.api @@ -19,4 +19,6 @@ RUN pdm sync --prod --no-editable EXPOSE 8000 RUN touch /first_run +# run alembic here because we are not forwarding the DB +# no start.sh script because need to disable websocket timeouts ENTRYPOINT ["/bin/sh", "-c", "if [ -f /first_run ]; then pdm run alembic upgrade head; rm /first_run; fi; exec pdm run app"] diff --git a/create.sh b/create.sh deleted file mode 100755 index 911f4e2..0000000 --- a/create.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -export POSTGRES_USER=MEGASCATTERBOMB -export POSTGRES_PASSWORD=masterbase -export POSTGRES_HOST=172.20.1.10 -export POSTGRES_PORT=5432 -export API_HOST=172.20.1.20 - - -if [ -z "${STEAM_API_KEY}" ]; then - echo "Error: STEAM_API_KEY variable is not set." - exit 1 -fi - - -if [[ $1 == "--replace" || $2 == "--replace" ]]; then - echo "Replacing containers..." - docker stop masterbase-db-dev - docker stop masterbase-api-dev - docker rm masterbase-api-dev - docker rmi api-dev - docker rm masterbase-db-dev - docker rmi db-dev - docker network rm masterbase-network-dev -fi - -if [[ $1 == "--development" || $2 == "--development" ]]; then - echo "Running in development mode..." - DEVELOPMENT=true -fi - -pdm sync -G:all -docker network create --driver bridge masterbase-network-dev --subnet=172.20.0.0/16 -docker build -f Dockerfile.db . -t db-dev -docker create --name masterbase-db-dev --network masterbase-network-dev --ip $POSTGRES_HOST -p 8050:5432 -e POSTGRES_USER=$POSTGRES_USER -e POSTGRES_PASSWORD=$POSTGRES_PASSWORD -e POSTGRES_DB=demos -t db-dev -docker start masterbase-db-dev -docker build -f Dockerfile.api . --build-arg DEVELOPMENT=$DEVELOPMENT -t api-dev -docker create --name masterbase-api-dev --network masterbase-network-dev --ip $API_HOST -p 8000:8000 -e STEAM_API_KEY=$STEAM_API_KEY -e POSTGRES_USER=$POSTGRES_USER -e POSTGRES_PASSWORD=$POSTGRES_PASSWORD -e POSTGRES_HOST=$POSTGRES_HOST -e POSTGRES_PORT=$POSTGRES_PORT -t api-dev -docker start masterbase-api-dev \ No newline at end of file diff --git a/deploy_api.sh b/deploy_api.sh new file mode 100755 index 0000000..f5a2006 --- /dev/null +++ b/deploy_api.sh @@ -0,0 +1,4 @@ +docker-compose stop api +docker-compose rm -f api +docker rmi masterbase-api --force +docker-compose up -d api diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..17659b0 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,69 @@ +version: '3.8' + +services: + db: + build: + context: . + dockerfile: Dockerfile.db + container_name: db + environment: + POSTGRES_USER: MEGASCATTERBOMB + POSTGRES_PASSWORD: masterbase + POSTGRES_DB: demos + networks: + masterbase-network-dev: + ipv4_address: 172.20.1.10 + ports: + - "8050:5432" + + api: + build: + context: . + dockerfile: Dockerfile.api + args: + DEVELOPMENT: ${DEVELOPMENT} + container_name: api + environment: + STEAM_API_KEY: ${STEAM_API_KEY} + POSTGRES_USER: MEGASCATTERBOMB + POSTGRES_PASSWORD: masterbase + POSTGRES_HOST: 172.20.1.10 + POSTGRES_PORT: 5432 + networks: + masterbase-network-dev: + ipv4_address: 172.20.1.20 + ports: + - "8000:8000" + + prometheus: + image: prom/prometheus:latest + container_name: prometheus + volumes: + - ./prometheus.yaml:/etc/prometheus/prometheus.yaml + command: + - '--config.file=/etc/prometheus/prometheus.yaml' + networks: + masterbase-network-dev: + ipv4_address: 172.20.1.30 + ports: + - "9090:9090" + + grafana: + image: grafana/grafana:latest + container_name: grafana + depends_on: + - prometheus + networks: + masterbase-network-dev: + ipv4_address: 172.20.1.40 + ports: + - "3000:3000" + environment: + - GF_SECURITY_ADMIN_PASSWORD=admin + +networks: + masterbase-network-dev: + driver: bridge + ipam: + config: + - subnet: 172.20.0.0/16 diff --git a/masterbase/app.py b/masterbase/app.py index ab72941..4226cf3 100644 --- a/masterbase/app.py +++ b/masterbase/app.py @@ -8,6 +8,7 @@ import requests import uvicorn from litestar import Litestar, MediaType, Request, WebSocket, get, post +from litestar.contrib.prometheus import PrometheusConfig, PrometheusController from litestar.exceptions import HTTPException, PermissionDeniedException from litestar.handlers import WebsocketListener from litestar.response import Redirect, Stream @@ -362,10 +363,12 @@ def provision_handler(request: Request) -> str: """ +prometheus_config = PrometheusConfig() app = Litestar( on_startup=startup_registers, route_handlers=[ + PrometheusController, session_id, close_session, DemoHandler, @@ -377,6 +380,7 @@ def provision_handler(request: Request) -> str: analyst_list_demos, report_player, ], + middleware=[prometheus_config.middleware], on_shutdown=shutdown_registers, opt={"DEVELOPMENT": bool(os.getenv("DEVELOPMENT"))}, ) diff --git a/prometheus.yaml b/prometheus.yaml new file mode 100644 index 0000000..c7eada7 --- /dev/null +++ b/prometheus.yaml @@ -0,0 +1,8 @@ +global: + scrape_interval: 15s + +scrape_configs: + - job_name: 'api' + metrics_path: '/metrics' + static_configs: + - targets: ['localhost:8000'] \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index b916b6d..3ffda05 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,13 +9,14 @@ dependencies = [ "toml>=0.10.2", "requests>=2.31.0", "pydantic>=2.5.3", - "litestar[standard]>=2.8.3", + "litestar[standard,prometheus]>=2.8.3", "alembic>=1.13.1", "psycopg2-binary>=2.9.9", "asyncpg>=0.29.0", "greenlet>=3.0.3", "uvicorn>=0.27.1", "numpy>=1.26.4", + "prometheus-client>=0.20.0", ] requires-python = ">=3.11,<3.13" readme = "README.md"