2026-10-02 00:03:48 +08:00
|
|
|
"""Start a loopback-only demo. Generate a private .env if absent; no cloud writes."""
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
import secrets
|
|
|
|
|
import subprocess
|
|
|
|
|
import sys
|
|
|
|
|
from datetime import UTC, datetime
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
|
|
import uvicorn
|
|
|
|
|
|
|
|
|
|
root = Path(__file__).resolve().parents[1]
|
|
|
|
|
sys.path.insert(0, str(root))
|
|
|
|
|
env = root / ".env"
|
|
|
|
|
if not env.exists():
|
|
|
|
|
text = (
|
|
|
|
|
(root / ".env.example")
|
|
|
|
|
.read_text()
|
|
|
|
|
.replace(
|
|
|
|
|
"FRAME_FLOW_TOKEN=\n",
|
|
|
|
|
"FRAME_FLOW_TOKEN=" + secrets.token_urlsafe(32) + "\n",
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
env.write_text(text)
|
|
|
|
|
env.chmod(0o600)
|
|
|
|
|
for line in env.read_text().splitlines():
|
|
|
|
|
if "=" in line and not line.startswith("#"):
|
|
|
|
|
key, value = line.split("=", 1)
|
|
|
|
|
os.environ.setdefault(key, value)
|
|
|
|
|
os.environ["DATA_DIR"] = str(root / "data")
|
|
|
|
|
os.environ["CONFIG_DIR"] = str(root / "config")
|
|
|
|
|
os.environ["KOKONNA_MOCK"] = "true"
|
|
|
|
|
os.environ["KOKONNA_WRITE_ENABLED"] = "false"
|
|
|
|
|
os.environ["BUILD_COMMIT"] = (
|
|
|
|
|
subprocess.run(
|
|
|
|
|
["git", "rev-parse", "HEAD"], cwd=root, capture_output=True, text=True
|
|
|
|
|
).stdout.strip()
|
|
|
|
|
or "development"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
os.environ["BUILD_TIME"] = datetime.now(UTC).isoformat()
|
|
|
|
|
uvicorn.run(
|
2026-10-16 16:25:42 +08:00
|
|
|
"pigway_frame_flow.main:app",
|
|
|
|
|
host="127.0.0.1",
|
|
|
|
|
port=int(os.getenv("WEB_PORT", "6005")),
|
|
|
|
|
access_log=False,
|
2026-10-02 00:03:48 +08:00
|
|
|
)
|