feat: Docker services (ws-gateway, corporate-memory, session-collector) + scheduler auto-auth
This commit is contained in:
parent
bae9619363
commit
4bad893cb8
2 changed files with 69 additions and 2 deletions
|
|
@ -39,6 +39,7 @@ services:
|
||||||
environment:
|
environment:
|
||||||
- DATA_DIR=/data
|
- DATA_DIR=/data
|
||||||
- API_URL=http://app:8000
|
- API_URL=http://app:8000
|
||||||
|
- SEED_ADMIN_EMAIL=${SEED_ADMIN_EMAIL:-}
|
||||||
depends_on:
|
depends_on:
|
||||||
app:
|
app:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
|
@ -58,5 +59,47 @@ services:
|
||||||
- full
|
- full
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
|
ws-gateway:
|
||||||
|
build: .
|
||||||
|
command: python -m services.ws_gateway
|
||||||
|
volumes:
|
||||||
|
- data:/data
|
||||||
|
env_file: .env
|
||||||
|
environment:
|
||||||
|
- DATA_DIR=/data
|
||||||
|
depends_on:
|
||||||
|
- app
|
||||||
|
profiles:
|
||||||
|
- full
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
corporate-memory:
|
||||||
|
build: .
|
||||||
|
command: python -m services.corporate_memory
|
||||||
|
volumes:
|
||||||
|
- data:/data
|
||||||
|
env_file: .env
|
||||||
|
environment:
|
||||||
|
- DATA_DIR=/data
|
||||||
|
depends_on:
|
||||||
|
- app
|
||||||
|
profiles:
|
||||||
|
- full
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
session-collector:
|
||||||
|
build: .
|
||||||
|
command: python -m services.session_collector
|
||||||
|
volumes:
|
||||||
|
- data:/data
|
||||||
|
env_file: .env
|
||||||
|
environment:
|
||||||
|
- DATA_DIR=/data
|
||||||
|
depends_on:
|
||||||
|
- app
|
||||||
|
profiles:
|
||||||
|
- full
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
data:
|
data:
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,29 @@ logger = logging.getLogger(__name__)
|
||||||
API_URL = os.environ.get("API_URL", "http://localhost:8000")
|
API_URL = os.environ.get("API_URL", "http://localhost:8000")
|
||||||
SCHEDULER_API_TOKEN = os.environ.get("SCHEDULER_API_TOKEN", "")
|
SCHEDULER_API_TOKEN = os.environ.get("SCHEDULER_API_TOKEN", "")
|
||||||
|
|
||||||
|
_cached_token = ""
|
||||||
|
|
||||||
|
def _get_auth_token() -> str:
|
||||||
|
"""Get auth token — use SCHEDULER_API_TOKEN or auto-fetch from API."""
|
||||||
|
global _cached_token
|
||||||
|
if SCHEDULER_API_TOKEN:
|
||||||
|
return SCHEDULER_API_TOKEN
|
||||||
|
if _cached_token:
|
||||||
|
return _cached_token
|
||||||
|
admin_email = os.environ.get("SEED_ADMIN_EMAIL", "")
|
||||||
|
if not admin_email:
|
||||||
|
logger.warning("No SCHEDULER_API_TOKEN or SEED_ADMIN_EMAIL — calls will be unauthenticated")
|
||||||
|
return ""
|
||||||
|
try:
|
||||||
|
resp = httpx.post(f"{API_URL}/auth/token", json={"email": admin_email}, timeout=10)
|
||||||
|
if resp.status_code == 200:
|
||||||
|
_cached_token = resp.json().get("access_token", "")
|
||||||
|
logger.info("Auto-fetched scheduler token for %s", admin_email)
|
||||||
|
return _cached_token
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning("Failed to fetch scheduler token: %s", e)
|
||||||
|
return ""
|
||||||
|
|
||||||
# Schedule definitions: (name, interval_seconds, api_endpoint, http_method)
|
# Schedule definitions: (name, interval_seconds, api_endpoint, http_method)
|
||||||
JOBS = [
|
JOBS = [
|
||||||
("data-refresh", 15 * 60, "/api/sync/trigger", "POST"),
|
("data-refresh", 15 * 60, "/api/sync/trigger", "POST"),
|
||||||
|
|
@ -43,8 +66,9 @@ def _call_api(endpoint: str, method: str = "POST") -> bool:
|
||||||
"""Call the main app API. Returns True on success."""
|
"""Call the main app API. Returns True on success."""
|
||||||
url = f"{API_URL}{endpoint}"
|
url = f"{API_URL}{endpoint}"
|
||||||
headers = {}
|
headers = {}
|
||||||
if SCHEDULER_API_TOKEN:
|
token = _get_auth_token()
|
||||||
headers["Authorization"] = f"Bearer {SCHEDULER_API_TOKEN}"
|
if token:
|
||||||
|
headers["Authorization"] = f"Bearer {token}"
|
||||||
try:
|
try:
|
||||||
if method == "POST":
|
if method == "POST":
|
||||||
resp = httpx.post(url, headers=headers, timeout=120)
|
resp = httpx.post(url, headers=headers, timeout=120)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue