feat(env): scripts connection urls for runs outside docker, sections ignore unknown keys
This commit is contained in:
1 parent
2c1dfefe34
commit
db8184cb37
2 files changed
+37
-18
No files matched your search
@@ -2,9 +2,9 @@
|
|||||||
{%- if layout == 'root' %}{% set _ = groups.append(["COMPOSE_PROFILES=" ~ ("external," if database != 'none' or use_redis else "") ~ "services"]) %}{% endif -%}
|
{%- if layout == 'root' %}{% set _ = groups.append(["COMPOSE_PROFILES=" ~ ("external," if database != 'none' or use_redis else "") ~ "services"]) %}{% endif -%}
|
||||||
{%- set _ = groups.append(["RUN_ENVIRONMENT=prod", "TZ=UTC"]) -%}
|
{%- set _ = groups.append(["RUN_ENVIRONMENT=prod", "TZ=UTC"]) -%}
|
||||||
{%- set _ = groups.append(["LOG__LEVEL=INFO", "LOG__LEVEL_EXTERNAL=WARNING", "LOG__SHOW_TIME=false", "LOG__CONSOLE_WIDTH=150"]) -%}
|
{%- set _ = groups.append(["LOG__LEVEL=INFO", "LOG__LEVEL_EXTERNAL=WARNING", "LOG__SHOW_TIME=false", "LOG__CONSOLE_WIDTH=150"]) -%}
|
||||||
{%- if database == 'mongo' %}{% set _ = groups.append(["DB__HOST=mongodb", "DB__PORT=27017", "DB__USER=" ~ project_slug, "DB__PASSWORD=" ~ project_slug, "DB__DB_NAME=" ~ project_slug]) %}{% endif -%}
|
{%- if database == 'mongo' %}{% set _ = groups.append(["DB__HOST=mongodb", "DB__PORT=27017", "DB__USER=" ~ project_slug, "DB__PASSWORD=" ~ project_slug, "DB__DB_NAME=" ~ project_slug, "DB__SCRIPTS_CONNECTION_URL=mongodb://" ~ project_slug ~ ":" ~ project_slug ~ "@localhost:27017/" ~ project_slug ~ "?authSource=admin"]) %}{% endif -%}
|
||||||
{%- if database == 'postgres' %}{% set _ = groups.append(["DB__HOST=postgres", "DB__PORT=5432", "DB__USER=" ~ project_slug, "DB__PASSWORD=" ~ project_slug, "DB__DB_NAME=" ~ project_slug]) %}{% endif -%}
|
{%- if database == 'postgres' %}{% set _ = groups.append(["DB__HOST=postgres", "DB__PORT=5432", "DB__USER=" ~ project_slug, "DB__PASSWORD=" ~ project_slug, "DB__DB_NAME=" ~ project_slug, "DB__SCRIPTS_CONNECTION_URL=postgresql://" ~ project_slug ~ ":" ~ project_slug ~ "@localhost:5432/" ~ project_slug]) %}{% endif -%}
|
||||||
{%- if use_redis %}{% set _ = groups.append(["REDIS__HOST=redis", "REDIS__PORT=6379", "REDIS__CACHE_TTL=300"]) %}{% endif -%}
|
{%- if use_redis %}{% set _ = groups.append(["REDIS__HOST=redis", "REDIS__PORT=6379", "REDIS__CACHE_TTL=300", "REDIS__SCRIPTS_CONNECTION_URL=redis://localhost:6379/0"]) %}{% endif -%}
|
||||||
{%- if 'api' in backend_services %}{% set _ = groups.append(["API__HOST=0.0.0.0", "API__PORT=8080", "API__WORKERS=1", "API__DOCS=false"]) %}{% endif -%}
|
{%- if 'api' in backend_services %}{% set _ = groups.append(["API__HOST=0.0.0.0", "API__PORT=8080", "API__WORKERS=1", "API__DOCS=false"]) %}{% endif -%}
|
||||||
{%- if 'aiogram_bot' in backend_services %}{% set _ = groups.append(["BOT__TOKEN="]) %}{% endif -%}
|
{%- if 'aiogram_bot' in backend_services %}{% set _ = groups.append(["BOT__TOKEN="]) %}{% endif -%}
|
||||||
{%- if include_payments %}{% set _ = groups.append(["CRYPTO_PAY__TOKEN="]) %}{% endif -%}
|
{%- if include_payments %}{% set _ = groups.append(["CRYPTO_PAY__TOKEN="]) %}{% endif -%}
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
{%- macro str_field(name, value) -%}
|
||||||
|
{%- set line = " " ~ name ~ ': str = "' ~ value ~ '"' -%}
|
||||||
|
{%- if line | length <= 88 or value | length + 10 > 88 %}{{ line }}{% else %} {{ name }}: str = (
|
||||||
|
"{{ value }}"
|
||||||
|
){% endif -%}
|
||||||
|
{%- endmacro -%}
|
||||||
{% if database != 'none' or use_redis %}import os
|
{% if database != 'none' or use_redis %}import os
|
||||||
|
|
||||||
{% endif %}from pydantic import Field{% if database != 'none' or 'aiogram_bot' in backend_services or include_payments or use_llm or use_redis %}, SecretStr{% endif %}
|
{% endif %}from pydantic import Field{% if database != 'none' or 'aiogram_bot' in backend_services or include_payments or use_llm or use_redis %}, SecretStr{% endif %}
|
||||||
@@ -8,30 +14,35 @@ def is_prod() -> bool:
|
|||||||
return os.getenv("RUN_ENVIRONMENT") == "prod"
|
return os.getenv("RUN_ENVIRONMENT") == "prod"
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
class Section(BaseSettings):
|
||||||
|
model_config = SettingsConfigDict(extra="ignore")
|
||||||
|
|
||||||
class LogSettings(BaseSettings):
|
|
||||||
|
class LogSettings(Section):
|
||||||
level: str = "INFO"
|
level: str = "INFO"
|
||||||
level_external: str = "WARNING"
|
level_external: str = "WARNING"
|
||||||
show_time: bool = False
|
show_time: bool = False
|
||||||
console_width: int = 150
|
console_width: int = 150
|
||||||
{% if database == 'mongo' %}
|
{% if database == 'mongo' %}
|
||||||
|
|
||||||
class DatabaseSettings(BaseSettings):
|
class DatabaseSettings(Section):
|
||||||
host: str = "mongodb"
|
host: str = "mongodb"
|
||||||
port: int = 27017
|
port: int = 27017
|
||||||
user: str = "{{ project_slug }}"
|
user: str = "{{ project_slug }}"
|
||||||
password: SecretStr = SecretStr("{{ project_slug }}")
|
password: SecretStr = SecretStr("{{ project_slug }}")
|
||||||
db_name: str = "{{ project_slug }}"
|
db_name: str = "{{ project_slug }}"
|
||||||
connection_params: str = "?authSource=admin"
|
connection_params: str = "?authSource=admin"
|
||||||
|
{{ str_field("scripts_connection_url", "mongodb://" ~ project_slug ~ ":" ~ project_slug ~ "@localhost:27017/" ~ project_slug ~ "?authSource=admin") }}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def connection_url(self) -> str:
|
def connection_url(self) -> str:
|
||||||
host = self.host if is_prod() else "localhost"
|
if not is_prod():
|
||||||
|
return self.scripts_connection_url
|
||||||
password = self.password.get_secret_value()
|
password = self.password.get_secret_value()
|
||||||
return f"mongodb://{self.user}:{password}@{host}:{self.port}/{self.db_name}{self.connection_params}"
|
return f"mongodb://{self.user}:{password}@{self.host}:{self.port}/{self.db_name}{self.connection_params}"
|
||||||
{% elif database == 'postgres' %}
|
{% elif database == 'postgres' %}
|
||||||
|
|
||||||
class DatabaseSettings(BaseSettings):
|
class DatabaseSettings(Section):
|
||||||
host: str = "postgres"
|
host: str = "postgres"
|
||||||
port: int = 5432
|
port: int = 5432
|
||||||
user: str = "{{ project_slug }}"
|
user: str = "{{ project_slug }}"
|
||||||
@@ -39,33 +50,37 @@ class DatabaseSettings(BaseSettings):
|
|||||||
db_name: str = "{{ project_slug }}"
|
db_name: str = "{{ project_slug }}"
|
||||||
min_pool_size: int = 5
|
min_pool_size: int = 5
|
||||||
max_pool_size: int = 20
|
max_pool_size: int = 20
|
||||||
|
{{ str_field("scripts_connection_url", "postgresql://" ~ project_slug ~ ":" ~ project_slug ~ "@localhost:5432/" ~ project_slug) }}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def connection_url(self) -> str:
|
def connection_url(self) -> str:
|
||||||
host = self.host if is_prod() else "localhost"
|
if not is_prod():
|
||||||
|
return self.scripts_connection_url
|
||||||
password = self.password.get_secret_value()
|
password = self.password.get_secret_value()
|
||||||
return f"postgresql://{self.user}:{password}@{host}:{self.port}/{self.db_name}"
|
return f"postgresql://{self.user}:{password}@{self.host}:{self.port}/{self.db_name}"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def async_connection_url(self) -> str:
|
def async_connection_url(self) -> str:
|
||||||
return self.connection_url.replace("postgresql://", "postgresql+asyncpg://", 1)
|
return self.connection_url.replace("postgresql://", "postgresql+asyncpg://", 1)
|
||||||
{% endif %}{% if use_redis %}
|
{% endif %}{% if use_redis %}
|
||||||
|
|
||||||
class RedisSettings(BaseSettings):
|
class RedisSettings(Section):
|
||||||
host: str = "redis"
|
host: str = "redis"
|
||||||
port: int = 6379
|
port: int = 6379
|
||||||
db: int = 0
|
db: int = 0
|
||||||
password: SecretStr | None = None
|
password: SecretStr | None = None
|
||||||
cache_ttl: int = 300
|
cache_ttl: int = 300
|
||||||
|
scripts_connection_url: str = "redis://localhost:6379/0"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def url(self) -> str:
|
def url(self) -> str:
|
||||||
host = self.host if is_prod() else "localhost"
|
if not is_prod():
|
||||||
|
return self.scripts_connection_url
|
||||||
auth = f":{self.password.get_secret_value()}@" if self.password else ""
|
auth = f":{self.password.get_secret_value()}@" if self.password else ""
|
||||||
return f"redis://{auth}{host}:{self.port}/{self.db}"
|
return f"redis://{auth}{self.host}:{self.port}/{self.db}"
|
||||||
{% endif %}{% if 'api' in backend_services %}
|
{% endif %}{% if 'api' in backend_services %}
|
||||||
|
|
||||||
class ApiSettings(BaseSettings):
|
class ApiSettings(Section):
|
||||||
host: str = "0.0.0.0" # noqa: S104
|
host: str = "0.0.0.0" # noqa: S104
|
||||||
port: int = 8080
|
port: int = 8080
|
||||||
workers: int = 1
|
workers: int = 1
|
||||||
@@ -75,16 +90,16 @@ class ApiSettings(BaseSettings):
|
|||||||
{%- endif %}
|
{%- endif %}
|
||||||
{% endif %}{% if 'aiogram_bot' in backend_services %}
|
{% endif %}{% if 'aiogram_bot' in backend_services %}
|
||||||
|
|
||||||
class BotSettings(BaseSettings):
|
class BotSettings(Section):
|
||||||
token: SecretStr = SecretStr("")
|
token: SecretStr = SecretStr("")
|
||||||
admins: list[int] = Field(default_factory=list)
|
admins: list[int] = Field(default_factory=list)
|
||||||
{% endif %}{% if include_payments %}
|
{% endif %}{% if include_payments %}
|
||||||
|
|
||||||
class CryptoPaySettings(BaseSettings):
|
class CryptoPaySettings(Section):
|
||||||
token: SecretStr = SecretStr("")
|
token: SecretStr = SecretStr("")
|
||||||
{% endif %}{% if use_llm %}
|
{% endif %}{% if use_llm %}
|
||||||
|
|
||||||
class LlmSettings(BaseSettings):
|
class LlmSettings(Section):
|
||||||
model: str = "google-gla:gemini-2.5-flash"
|
model: str = "google-gla:gemini-2.5-flash"
|
||||||
gemini_api_key: SecretStr = SecretStr("")
|
gemini_api_key: SecretStr = SecretStr("")
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -111,10 +126,14 @@ class Settings(BaseSettings):
|
|||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
||||||
model_config = SettingsConfigDict(
|
model_config = SettingsConfigDict(
|
||||||
|
{%- if layout == 'part' %}
|
||||||
case_sensitive=False,
|
case_sensitive=False,
|
||||||
env_file={% if layout == 'part' %}("../.env", ".env"){% else %}".env"{% endif %},
|
env_file=("../.env", ".env"),
|
||||||
env_nested_delimiter="__",
|
env_nested_delimiter="__",
|
||||||
extra="ignore",
|
extra="ignore",
|
||||||
|
{%- else %}
|
||||||
|
case_sensitive=False, env_file=".env", env_nested_delimiter="__", extra="ignore"
|
||||||
|
{%- endif %}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user