56 lines
3.2 KiB
Python
56 lines
3.2 KiB
Python
#!/usr/bin/env python3
|
|
import argparse
|
|
import getpass
|
|
import os
|
|
from pathlib import Path
|
|
import subprocess
|
|
import sys
|
|
|
|
FIELDS = (
|
|
("DATABASE_URL", "阿里云RDS PostgreSQL连接串", "已有DobotAI专用阿里云RDS数据库;脚本只检查表,空库才初始化。", "postgres://USER:***@rds-endpoint:5432/dobotai?sslmode=require", True),
|
|
("WEKNORA_BASE_URL", "WeKnora 地址", "应用容器通过宿主机网络访问既有WeKnora。", "http://127.0.0.1:8080", False),
|
|
("WEKNORA_API_KEY", "WeKnora API Key", "DobotAI专用WeKnora API Key。", "<你的WeKnora API Key>", True),
|
|
("DOBOTAI_INGRESS_TOKEN", "DobotAI Ingress Token", "调用/v1/qa的独立令牌。", "<随机长字符串>", True),
|
|
("DOBOTAI_TENANT_KEY", "DobotAI租户键", "必须与现有DobotAI数据一致。", "dobotai", False),
|
|
("DOBOTAI_AGENT_BINDINGS", "DobotAI Agent Bindings JSON", "钉钉会话到WeKnora Agent映射。", '{"dingtalk:*":"你的Agent ID"}', False),
|
|
("DINGTALK_CLIENT_ID", "钉钉 Client ID", "钉钉应用Client ID/AppKey。", "dingxxxxxxxx", False),
|
|
("DINGTALK_CLIENT_SECRET", "钉钉 Client Secret", "钉钉应用Client Secret/AppSecret。", "<你的钉钉 AppSecret>", True),
|
|
)
|
|
|
|
def parse_env(path):
|
|
lines = path.read_text(encoding="utf-8").splitlines(); values = {}
|
|
for line in lines:
|
|
if line and not line.lstrip().startswith("#") and "=" in line:
|
|
key, value = line.split("=", 1); values[key.strip()] = value
|
|
return lines, values
|
|
|
|
def write_env(path, lines, values):
|
|
rendered=[]; written=set()
|
|
for line in lines:
|
|
if line and not line.lstrip().startswith("#") and "=" in line:
|
|
key=line.split("=",1)[0].strip()
|
|
if key in values: rendered.append(f"{key}={values[key]}"); written.add(key); continue
|
|
rendered.append(line)
|
|
rendered.extend(f"{key}={value}" for key,value in values.items() if key not in written)
|
|
temp=path.with_name(path.name+".new"); temp.write_text("\n".join(rendered)+"\n",encoding="utf-8"); os.chmod(temp,0o600); os.replace(temp,path)
|
|
|
|
def main():
|
|
parser=argparse.ArgumentParser(description="配置DobotAI阿里云RDS和渠道凭证")
|
|
parser.add_argument("--env-file",required=True); parser.add_argument("--schema-script",required=True); parser.add_argument("--start-script",required=True)
|
|
args=parser.parse_args(); path=Path(args.env_file)
|
|
if not path.is_file(): raise SystemExit("DobotAI环境文件不存在,请先执行根目录install-docker.sh。")
|
|
lines,values=parse_env(path)
|
|
for key,label,description,example,secret in FIELDS:
|
|
suffix="(已配置,直接回车保留)" if values.get(key,"").strip() else "(必填)"
|
|
print(f"\n{label}\n用途:{description}\n格式示例:{example}")
|
|
entered=(getpass.getpass if secret else input)(f"{label}{suffix}: ").strip()
|
|
if entered: values[key]=entered
|
|
missing=[label for key,label,*_ in FIELDS if not values.get(key,"").strip()]
|
|
if missing: raise SystemExit("以下必填项未配置:"+"、".join(missing))
|
|
write_env(path,lines,values)
|
|
subprocess.run([args.schema_script], check=True)
|
|
os.execv(args.start_script,[args.start_script])
|
|
if __name__=="__main__":
|
|
try: main()
|
|
except KeyboardInterrupt: sys.exit(130)
|