脚本一键化

This commit is contained in:
2026-07-19 00:21:23 +08:00
parent 7a138559de
commit 700db4efb9
3 changed files with 91 additions and 71 deletions
+43 -2
View File
@@ -1,5 +1,5 @@
from fastapi import APIRouter, Depends, HTTPException, Header, Cookie
from fastapi.responses import JSONResponse
from fastapi import APIRouter, Depends, HTTPException, Header, Cookie, Request
from fastapi.responses import JSONResponse, PlainTextResponse
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select, func
from sqlalchemy.orm import selectinload
@@ -652,6 +652,47 @@ async def admin_download_script(
)
@router.get("/script/setup")
async def admin_setup_script(
request: Request,
domain: str,
server_name: str,
os: str = "linux",
authorization: str = Header(None),
db: AsyncSession = Depends(get_db),
_: bool = Depends(require_auth),
):
"""生成一键安装脚本(纯文本下载)"""
from jinja2 import Environment, FileSystemLoader
template_dir = Path(__file__).parent.parent / "templates_cert"
jinja_env = Environment(loader=FileSystemLoader(str(template_dir)))
settings = get_settings()
base_url = str(request.base_url).rstrip("/")
ext = "ps1" if os == "windows" else "sh"
download_url = f"{base_url}/admin/api/script/download?domain={domain}&server_name={server_name}&os={os}"
# 提取 admin token 用于嵌入脚本
admin_token = ""
if authorization and authorization.startswith("Bearer "):
admin_token = authorization[7:]
template_name = "setup-cert.ps1.j2" if os == "windows" else "setup-cert.sh.j2"
tpl = jinja_env.get_template(template_name)
script = tpl.render(
domain=domain,
server_name=server_name,
download_url=download_url,
admin_token=admin_token,
)
filename = f"setup-{domain.replace('*', '_')}.{ext}"
return PlainTextResponse(
script,
headers={"Content-Disposition": f'attachment; filename="{filename}"'},
)
# ──────────────── 证书信息 ────────────────
@router.get("/cert-info/{domain_id}")