#!/usr/bin/env python3 """Sync backend/.env vers Koyeb service (gratuit, sans carte).""" from __future__ import annotations import os import subprocess import sys from pathlib import Path from dotenv import load_dotenv ROOT = Path(__file__).resolve().parents[1] load_dotenv(ROOT / "emo" / "backend" / ".env", override=True) APP = os.environ.get("KOYEB_APP", "emo-online") SERVICE = os.environ.get("KOYEB_SERVICE", "emo-online-api") BACKEND = os.environ.get("EMO_PUBLIC_BACKEND_URL", f"https://{SERVICE}-{os.environ.get('KOYEB_ORG', 'user')}.koyeb.app").rstrip("/") SECRETS = [ "MONGO_URL", "GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET", "OPENAI_API_KEY", "ANTHROPIC_API_KEY", "GEMINI_API_KEY", "GROQ_API_KEY", "OPENROUTER_API_KEY", "DEEPSEEK_API_KEY", "HF_TOKEN", "HUGGINGFACE_API_KEY", "EMERGENT_LLM_KEY", "STRIPE_API_KEY", "STRIPE_BASIC_LINK", "STRIPE_PREMIUM_LINK", "STRIPE_ULTRA_LINK", "EMO_PRODUCT_KEYS", ] VARS = { "DB_NAME": "emo", "EMO_DEV_MODE": "false", "EMO_SERVE_FRONTEND": "false", "EMO_BROWSER_ENABLED": "false", "EMO_USE_SALES_LLM_KEYS": "true", "EMO_PUBLIC_BACKEND_URL": BACKEND, "EMO_FRONTEND_URL": "https://xeroxytb.com", "CORS_ORIGINS": "https://xeroxytb.com,https://www.xeroxytb.com,https://xeroxytb.github.io", "GOOGLE_REDIRECT_URI": f"{BACKEND}/api/auth/google/callback", "PORT": "8010", "EMO_ADMIN_EMAILS": os.environ.get("EMO_ADMIN_EMAILS", "huglostalatac@gmail.com"), } SALES = { "SALES_OPENAI_API_KEY": "OPENAI_API_KEY", "SALES_ANTHROPIC_API_KEY": "ANTHROPIC_API_KEY", "SALES_GEMINI_API_KEY": "GEMINI_API_KEY", "SALES_GROQ_API_KEY": "GROQ_API_KEY", "SALES_OPENROUTER_API_KEY": "OPENROUTER_API_KEY", "SALES_DEEPSEEK_API_KEY": "DEEPSEEK_API_KEY", "SALES_HF_TOKEN": "HF_TOKEN", } def run(args: list[str]) -> subprocess.CompletedProcess: return subprocess.run(args, capture_output=True, text=True) def main() -> int: token = os.environ.get("KOYEB_TOKEN", "").strip() if not token: print("KOYEB_TOKEN manquant") print("1. Cree un compte sur https://app.koyeb.com (gratuit, sans carte)") print("2. Settings > API > Create token") print("3. Ajoute KOYEB_TOKEN=... dans emo/backend/.env") return 1 env = os.environ.copy() env["KOYEB_TOKEN"] = token # Verifier service st = run(["koyeb", "service", "list", "-o", "json"]) if st.returncode != 0: print(st.stderr or st.stdout) return 1 pairs: list[str] = [] for k in SECRETS: v = os.environ.get(k, "").strip() if v: pairs.append(f"{k}={v}") for k, v in VARS.items(): pairs.append(f"{k}={v}") for sales, src in SALES.items(): v = os.environ.get(sales, "").strip() or os.environ.get(src, "").strip() if v: pairs.append(f"{sales}={v}") cmd = ["koyeb", "service", "update", f"{APP}/{SERVICE}", "--env"] + pairs r = subprocess.run(cmd, env=env) if r.returncode != 0: return r.returncode print("Koyeb env sync OK") return 0 if __name__ == "__main__": raise SystemExit(main())