Skip to content

Commit c704b8a

Browse files
committed
Allow users to run locally the application and services without further configuration
1 parent 0f3a601 commit c704b8a

File tree

3 files changed

+115
-75
lines changed

3 files changed

+115
-75
lines changed
Lines changed: 89 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,108 @@
11
# ============================================================================
2-
# WARNING: EXAMPLE CONFIGURATION - DO NOT USE IN PRODUCTION AS-IS
2+
# ENVIRONMENT CONFIGURATION EXAMPLE
33
# ============================================================================
4-
# This file contains example values for development/testing purposes only.
54
#
6-
# SECURITY CRITICAL: Before deploying to production, you MUST:
7-
# 1. Copy this file to a .env file at the project root
8-
# 2. Generate a new SECRET_KEY using: openssl rand -hex 32
9-
# 3. Change all passwords (POSTGRES_PASSWORD, ADMIN_PASSWORD, etc.)
10-
# 4. Update all sensitive configuration values
5+
# WARNING:
6+
# This file contains example values for LOCAL DEVELOPMENT AND TESTING only.
7+
#
8+
# DOCKER COMPOSE USAGE:
9+
# This file is NOT required when running locally with docker-compose.
10+
# Default settings in the application code work out of the box.
11+
#
12+
# WHEN TO USE THIS FILE:
13+
# - Testing with external databases or services
14+
# - Overriding default settings found in /src/app/core/config.py
15+
#
16+
# DEPLOYMENTS:
17+
# DO NOT use an .env file to modify the default settings.
18+
# Instead, set environment variables in your deployment host or platform.
19+
#
20+
# SECURITY NOTE:
21+
# Before deploying, you MUST use different sensitive values:
22+
# • SECRET_KEY (generate a new one: openssl rand -hex 32)
23+
# • All passwords (POSTGRES_PASSWORD, ADMIN_PASSWORD, etc.)
24+
# • Usernames for admin and database users
1125
#
12-
# Using these example values in production is a SECURITY RISK.
1326
# ============================================================================
1427

1528
# ------------- app settings -------------
16-
APP_NAME="My Project"
17-
APP_DESCRIPTION="My Project Description"
18-
APP_VERSION="0.1"
19-
CONTACT_NAME="Me"
20-
CONTACT_EMAIL="[email protected]"
21-
LICENSE_NAME="MIT"
29+
# APP_NAME="My Project"
30+
# APP_VERSION="0.1"
31+
# APP_DESCRIPTION="My Project Description"
32+
# LICENSE_NAME="MIT"
33+
# CONTACT_NAME="Me"
34+
# CONTACT_EMAIL="[email protected]"
35+
36+
# ------------- environment -------------
37+
# ENVIRONMENT="local"
2238

23-
# ------------- database -------------
24-
POSTGRES_USER="postgres"
25-
POSTGRES_PASSWORD=1234
26-
POSTGRES_SERVER="db"
27-
POSTGRES_PORT=5432
28-
POSTGRES_DB="postgres"
29-
POSTGRES_ASYNC_PREFIX="postgresql+asyncpg://"
39+
# ------------- crypt settings -------------
40+
# SECRET_KEY=de2132a4a3a029d6a93a2aefcb519f0219990f92ca258a7c5ed938a444dbe1c8
41+
# ALGORITHM=HS256
42+
# ACCESS_TOKEN_EXPIRE_MINUTES=30
43+
# REFRESH_TOKEN_EXPIRE_DAYS=7
3044

31-
# ------------- crypt -------------
32-
SECRET_KEY=de2132a4a3a029d6a93a2aefcb519f0219990f92ca258a7c5ed938a444dbe1c8
33-
ALGORITHM=HS256
34-
ACCESS_TOKEN_EXPIRE_MINUTES=60
45+
# ------------- postgres settings -------------
46+
# POSTGRES_USER="myappuser"
47+
# POSTGRES_PASSWORD=r8andomP@ssw0rd!
48+
# POSTGRES_SERVER="10.0.0.50"
49+
# POSTGRES_PORT=5432
50+
# POSTGRES_DB="myappdb"
51+
# POSTGRES_SYNC_PREFIX="postgresql://"
52+
# POSTGRES_ASYNC_PREFIX="postgresql+asyncpg://"
3553

36-
# ------------- admin -------------
37-
ADMIN_NAME="admin"
38-
ADMIN_EMAIL="[email protected]"
39-
ADMIN_USERNAME="admin"
40-
ADMIN_PASSWORD="Str1ngst!"
54+
# ------------- first user settings -------------
55+
# ADMIN_NAME="admin"
56+
# ADMIN_EMAIL="[email protected]"
57+
# ADMIN_USERNAME="admin"
58+
# ADMIN_PASSWORD="Str1ngst!"
4159

42-
# ------------- redis cache -------------
43-
REDIS_CACHE_HOST="redis"
44-
REDIS_CACHE_PORT=6379
60+
# ------------- test settings -------------
61+
# TEST_NAME="Tester User"
62+
# TEST_EMAIL="[email protected]"
63+
# TEST_USERNAME="testeruser"
64+
# TEST_PASSWORD="Str1ngT3st!"
4565

46-
# ------------- redis queue -------------
47-
REDIS_QUEUE_HOST="redis"
48-
REDIS_QUEUE_PORT=6379
66+
# ------------- redis cache settings -------------
67+
# REDIS_CACHE_HOST="10.0.0.90"
68+
# REDIS_CACHE_PORT=6379
4969

50-
# ------------- redis rate limit -------------
51-
REDIS_RATE_LIMIT_HOST="redis"
52-
REDIS_RATE_LIMIT_PORT=6379
70+
# ------------- redis queue settings -------------
71+
# REDIS_QUEUE_HOST="10.0.0.90"
72+
# REDIS_QUEUE_PORT=6379
5373

54-
# ------------- client side cache -------------
55-
CLIENT_CACHE_MAX_AGE=60
74+
# ------------- redis rate limiter settings -------------
75+
# REDIS_RATE_LIMIT_HOST="10.0.0.90"
76+
# REDIS_RATE_LIMIT_PORT=6379
5677

57-
# ------------- CORS -------------
58-
CORS_ORIGINS=["*"]
59-
CORS_METHODS=["*"]
60-
CORS_HEADERS=["*"]
78+
# ------------- client side cache settings -------------
79+
# CLIENT_CACHE_MAX_AGE=60
6180

62-
# ------------- test -------------
63-
TEST_NAME="Tester User"
64-
TEST_EMAIL="[email protected]"
65-
TEST_USERNAME="testeruser"
66-
TEST_PASSWORD="Str1ngT3st!"
81+
# ------------- default rate limit settings -------------
82+
# DEFAULT_RATE_LIMIT_LIMIT=10
83+
# DEFAULT_RATE_LIMIT_PERIOD=3600
6784

68-
# ------------- environment -------------
69-
ENVIRONMENT="local"
85+
# ------------- crud admin settings -------------
86+
# CRUD_ADMIN_ENABLED=True
87+
# CRUD_ADMIN_MOUNT_PATH="/admin"
88+
# CRUD_ADMIN_ALLOWED_IPS_LIST=None
89+
# CRUD_ADMIN_ALLOWED_NETWORKS_LIST=None
90+
# CRUD_ADMIN_MAX_SESSIONS=10
91+
# CRUD_ADMIN_SESSION_TIMEOUT=1440
92+
# SESSION_SECURE_COOKIES=True
93+
# CRUD_ADMIN_TRACK_EVENTS=True
94+
# CRUD_ADMIN_TRACK_SESSIONS=True
95+
# CRUD_ADMIN_REDIS_ENABLED=False
96+
# CRUD_ADMIN_REDIS_HOST="localhost"
97+
# CRUD_ADMIN_REDIS_PORT=6379
98+
# CRUD_ADMIN_REDIS_DB=0
99+
# CRUD_ADMIN_REDIS_PASSWORD=None
100+
# CRUD_ADMIN_REDIS_SSL=False
101+
102+
# ------------- CORS -------------
103+
# CORS_ORIGINS=["*"]
104+
# CORS_METHODS=["*"]
105+
# CORS_HEADERS=["*"]
70106

71107
# ------------- first tier -------------
72-
TIER_NAME="free"
108+
# TIER_NAME="free"

scripts/local_with_uvicorn/docker-compose.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ services:
3131

3232
db:
3333
image: postgres:13
34+
environment:
35+
POSTGRES_USER: ${POSTGRES_USER:-postgres}
36+
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password}
37+
POSTGRES_DB: ${POSTGRES_DB:-postgres}
3438
env_file:
3539
- .env
3640
volumes:

src/app/core/config.py

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,25 @@
55
from pydantic_settings import BaseSettings, SettingsConfigDict
66

77

8+
class EnvironmentOption(str, Enum):
9+
LOCAL = "local"
10+
STAGING = "staging"
11+
PRODUCTION = "production"
12+
13+
814
class AppSettings(BaseSettings):
9-
APP_NAME: str = "FastAPI app"
15+
APP_NAME: str = "My Project"
16+
APP_VERSION: str = "0.1"
1017
APP_DESCRIPTION: str | None = None
11-
APP_VERSION: str | None = None
1218
LICENSE_NAME: str | None = None
1319
CONTACT_NAME: str | None = None
1420
CONTACT_EMAIL: str | None = None
1521

1622

23+
class EnvironmentSettings(BaseSettings):
24+
ENVIRONMENT: EnvironmentOption = EnvironmentOption.LOCAL
25+
26+
1727
class CryptSettings(BaseSettings):
1828
SECRET_KEY: SecretStr = SecretStr("secret-key")
1929
ALGORITHM: str = "HS256"
@@ -51,8 +61,8 @@ def MYSQL_URI(self) -> str:
5161

5262
class PostgresSettings(DatabaseSettings):
5363
POSTGRES_USER: str = "postgres"
54-
POSTGRES_PASSWORD: str = "postgres"
55-
POSTGRES_SERVER: str = "localhost"
64+
POSTGRES_PASSWORD: str = "password"
65+
POSTGRES_SERVER: str = "db"
5666
POSTGRES_PORT: int = 5432
5767
POSTGRES_DB: str = "postgres"
5868
POSTGRES_SYNC_PREFIX: str = "postgresql://"
@@ -71,15 +81,15 @@ class FirstUserSettings(BaseSettings):
7181
ADMIN_NAME: str = "admin"
7282
ADMIN_EMAIL: str = "[email protected]"
7383
ADMIN_USERNAME: str = "admin"
74-
ADMIN_PASSWORD: str = "!Ch4ng3Th1sP4ssW0rd!"
84+
ADMIN_PASSWORD: str = "password"
7585

7686

7787
class TestSettings(BaseSettings):
7888
...
7989

8090

8191
class RedisCacheSettings(BaseSettings):
82-
REDIS_CACHE_HOST: str = "localhost"
92+
REDIS_CACHE_HOST: str = "redis"
8393
REDIS_CACHE_PORT: int = 6379
8494

8595
@computed_field # type: ignore[prop-decorator]
@@ -88,17 +98,13 @@ def REDIS_CACHE_URL(self) -> str:
8898
return f"redis://{self.REDIS_CACHE_HOST}:{self.REDIS_CACHE_PORT}"
8999

90100

91-
class ClientSideCacheSettings(BaseSettings):
92-
CLIENT_CACHE_MAX_AGE: int = 60
93-
94-
95101
class RedisQueueSettings(BaseSettings):
96-
REDIS_QUEUE_HOST: str = "localhost"
102+
REDIS_QUEUE_HOST: str = "redis"
97103
REDIS_QUEUE_PORT: int = 6379
98104

99105

100106
class RedisRateLimiterSettings(BaseSettings):
101-
REDIS_RATE_LIMIT_HOST: str = "localhost"
107+
REDIS_RATE_LIMIT_HOST: str = "redis"
102108
REDIS_RATE_LIMIT_PORT: int = 6379
103109

104110
@computed_field # type: ignore[prop-decorator]
@@ -107,6 +113,10 @@ def REDIS_RATE_LIMIT_URL(self) -> str:
107113
return f"redis://{self.REDIS_RATE_LIMIT_HOST}:{self.REDIS_RATE_LIMIT_PORT}"
108114

109115

116+
class ClientSideCacheSettings(BaseSettings):
117+
CLIENT_CACHE_MAX_AGE: int = 60
118+
119+
110120
class DefaultRateLimitSettings(BaseSettings):
111121
DEFAULT_RATE_LIMIT_LIMIT: int = 10
112122
DEFAULT_RATE_LIMIT_PERIOD: int = 3600
@@ -133,16 +143,6 @@ class CRUDAdminSettings(BaseSettings):
133143
CRUD_ADMIN_REDIS_SSL: bool = False
134144

135145

136-
class EnvironmentOption(str, Enum):
137-
LOCAL = "local"
138-
STAGING = "staging"
139-
PRODUCTION = "production"
140-
141-
142-
class EnvironmentSettings(BaseSettings):
143-
ENVIRONMENT: EnvironmentOption = EnvironmentOption.LOCAL
144-
145-
146146
class CORSSettings(BaseSettings):
147147
CORS_ORIGINS: list[str] = ["*"]
148148
CORS_METHODS: list[str] = ["*"]

0 commit comments

Comments
 (0)