diff --git a/README.md b/README.md index 0da247f..3aa6519 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,7 @@ 1. [JWT Authentication](#512-jwt-authentication) 1. [Running](#513-running) 1. [Create Application](#514-create-application) + 2. [Opting Out of Services](#515-opting-out-of-services) 1. [Running in Production](#6-running-in-production) 1. [Uvicorn Workers with Gunicorn](#61-uvicorn-workers-with-gunicorn) 1. [Running With NGINX](#62-running-with-nginx) @@ -1475,6 +1476,124 @@ And for the worker: ```sh poetry run arq src.app.core.worker.settings.WorkerSettings ``` +### 5.14 Create Application + +If you want to stop tables from being created every time you run the api, you should disable this here: + +```python +# app/main.py + +from .api import router +from .core.config import settings +from .core.setup import create_application + +# create_tables_on_start defaults to True +app = create_application(router=router, settings=settings, create_tables_on_start=False) +``` + +This `create_application` function is defined in `app/core/setup.py`, and it's a flexible way to configure the behavior of your application. + +A few examples: + +- Deactivate or password protect /docs +- Add client-side cache middleware +- Add Startup and Shutdown event handlers for cache, queue and rate limit + +### 5.15 Opting Out of Services + +To opt out of services (like `Redis`, `Queue`, `Rate Limiter`), head to the `Settings` class in `src/app/core/config`: + +```python +# src/app/core/config +import os +from enum import Enum + +from pydantic_settings import BaseSettings +from starlette.config import Config + +current_file_dir = os.path.dirname(os.path.realpath(__file__)) +env_path = os.path.join(current_file_dir, "..", "..", ".env") +config = Config(env_path) +... + +class Settings( + AppSettings, + PostgresSettings, + CryptSettings, + FirstUserSettings, + TestSettings, + RedisCacheSettings, + ClientSideCacheSettings, + RedisQueueSettings, + RedisRateLimiterSettings, + DefaultRateLimitSettings, + EnvironmentSettings, +): + pass + + +settings = Settings() +``` + +And remove the Settings of the services you do not need. For example, without using redis (removed `Cache`, `Queue` and `Rate limit`): + +```python +class Settings( + AppSettings, + PostgresSettings, + CryptSettings, + FirstUserSettings, + TestSettings, + ClientSideCacheSettings, + DefaultRateLimitSettings, + EnvironmentSettings, +): + pass +``` + +Then comment or remove the services you do not want from `docker-compose.yml`. Here, I removed `redis` and `worker` services: + +```yml +version: '3.8' + +services: + web: + build: + context: . + dockerfile: Dockerfile + # -------- replace with comment to run with gunicorn -------- + command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload + # command: gunicorn app.main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000 + env_file: + - ./src/.env + # -------- replace with comment if you are using nginx -------- + ports: + - "8000:8000" + # expose: + # - "8000" + depends_on: + - db + - redis + volumes: + - ./src/app:/code/app + - ./src/.env:/code/.env + db: + image: postgres:13 + env_file: + - ./src/.env + volumes: + - postgres-data:/var/lib/postgresql/data + # -------- replace with comment to run migrations with docker -------- + expose: + - "5432" + # ports: + # - 5432:5432 + +volumes: + postgres-data: + redis-data: + #pgadmin-data: +``` ## 6. Running in Production @@ -1531,29 +1650,6 @@ CMD ["gunicorn", "app.main:app", "-w", "4", "-k", "uvicorn.workers.UvicornWorker > \[!CAUTION\] > Do not forget to set the `ENVIRONMENT` in `.env` to `production` unless you want the API docs to be public. -### 5.14 Create Application - -If you want to stop tables from being created every time you run the api, you should disable this here: - -```python -# app/main.py - -from .api import router -from .core.config import settings -from .core.setup import create_application - -# create_tables_on_start defaults to True -app = create_application(router=router, settings=settings, create_tables_on_start=False) -``` - -This `create_application` function is defined in `app/core/setup.py`, and it's a flexible way to configure the behavior of your application. - -A few examples: - -- Deactivate or password protect /docs -- Add client-side cache middleware -- Add Startup and Shutdown event handlers for cache, queue and rate limit - ### 6.2 Running with NGINX NGINX is a high-performance web server, known for its stability, rich feature set, simple configuration, and low resource consumption. NGINX acts as a reverse proxy, that is, it receives client requests, forwards them to the FastAPI server (running via Uvicorn or Gunicorn), and then passes the responses back to the clients.