Corin1998 commited on
Commit
c86f1ad
·
verified ·
1 Parent(s): fc38e4a

Update app/config.py

Browse files
Files changed (1) hide show
  1. app/config.py +34 -9
app/config.py CHANGED
@@ -1,11 +1,16 @@
1
- from pydantic_settings import BaseSettings
2
- from pydantic import Field
3
- import os
4
 
5
  class Settings(BaseSettings):
 
 
6
  app_name: str = "GrowthOps OS"
7
  environment: str = "prod"
8
- jwt_secret: str = Field(..., alias="JWT_SECRET")
 
 
 
9
  port: int = int(os.getenv("PORT", "7860"))
10
 
11
  use_internal_postgres: bool = Field(default=False, alias="USE_INTERNAL_POSTGRES")
@@ -13,14 +18,34 @@ class Settings(BaseSettings):
13
  postgres_password: str = Field(default="app", alias="POSTGRES_PASSWORD")
14
  postgres_db: str = Field(default="growthops", alias="POSTGRES_DB")
15
 
16
- redis_url: str = "redis://127.0.0.1:6379/0"
17
  otlp_endpoint: str | None = Field(default=None, alias="OTLP_ENDPOINT")
18
 
19
- class Config:
20
- extra = "ignore"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
  def build_database_url(settings: Settings) -> str:
23
  if settings.use_internal_postgres:
24
- return f"postgresql+psycopg2://{settings.postgres_user}:{settings.postgres_password}@127.0.0.1:5432/{settings.postgres_db}"
25
- # default to SQLite persisted on /data
 
 
 
26
  return "sqlite+pysqlite:////data/growthops.sqlite3"
 
1
+ from pydantic_settings import BaseSettings, SettingsConfigDict
2
+ from pydantic import Field, model_validator
3
+ import os, secrets, pathlib
4
 
5
  class Settings(BaseSettings):
6
+ model_config = SettingsConfigDict(extra='ignore', env_prefix='', case_sensitive=True)
7
+
8
  app_name: str = "GrowthOps OS"
9
  environment: str = "prod"
10
+
11
+ # 未設定でも起動できるように None を許容し、後段で生成する
12
+ jwt_secret: str | None = Field(default=None, alias="JWT_SECRET")
13
+
14
  port: int = int(os.getenv("PORT", "7860"))
15
 
16
  use_internal_postgres: bool = Field(default=False, alias="USE_INTERNAL_POSTGRES")
 
18
  postgres_password: str = Field(default="app", alias="POSTGRES_PASSWORD")
19
  postgres_db: str = Field(default="growthops", alias="POSTGRES_DB")
20
 
21
+ redis_url: str = Field(default="redis://127.0.0.1:6379/0", alias="REDIS_URL")
22
  otlp_endpoint: str | None = Field(default=None, alias="OTLP_ENDPOINT")
23
 
24
+ @model_validator(mode="after")
25
+ def _ensure_jwt_secret(self):
26
+ # 1) 環境変数があればそれを使う
27
+ if self.jwt_secret:
28
+ return self
29
+ # 2) 永続ファイルがあればそれを使う
30
+ path = pathlib.Path("/data/jwt_secret")
31
+ if path.exists():
32
+ self.jwt_secret = path.read_text().strip()
33
+ return self
34
+ # 3) 何も無ければ生成して永続化
35
+ secret = secrets.token_urlsafe(48)
36
+ try:
37
+ path.write_text(secret)
38
+ except Exception:
39
+ # 書けなくても起動は継続(再起動時に別の鍵になる点に注意)
40
+ pass
41
+ self.jwt_secret = secret
42
+ return self
43
 
44
  def build_database_url(settings: Settings) -> str:
45
  if settings.use_internal_postgres:
46
+ return (
47
+ f"postgresql+psycopg2://{settings.postgres_user}:"
48
+ f"{settings.postgres_password}@127.0.0.1:5432/{settings.postgres_db}"
49
+ )
50
+ # デフォルトは /data の SQLite(HF の Persistent storage 上)
51
  return "sqlite+pysqlite:////data/growthops.sqlite3"