Bootstrap v2 už nejde spustit bez režimu:

výchozí akce je Run Bootstrap Check s mode=check,
Run Bootstrap Repair je samostatná akce s potvrzením,
Run Bootstrap Deploy je oddělený ve výrazném varování a není defaultní.
This commit is contained in:
JiriUhlir
2026-06-08 08:08:14 +02:00
parent 6622db2fb3
commit 2571e6e50e
+34 -11
View File
@@ -1,6 +1,6 @@
import html import html
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Form, HTTPException, Request
from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.responses import HTMLResponse, RedirectResponse
from app.auth import require_user from app.auth import require_user
@@ -18,6 +18,7 @@ from app.routes.jobs import render_job_status
from app.templates.layout import page from app.templates.layout import page
router = APIRouter() router = APIRouter()
BOOTSTRAP_MODES = {"check", "repair", "deploy"}
def render_readiness_pill(ready: bool) -> str: def render_readiness_pill(ready: bool) -> str:
@@ -107,23 +108,36 @@ def migration_readiness_page(request: Request, user=Depends(require_user)):
<form method="post" action="/portal/migration-readiness/run"> <form method="post" action="/portal/migration-readiness/run">
<button type="submit">Spustit preflight kontrolu</button> <button type="submit">Spustit preflight kontrolu</button>
</form> </form>
<form method="post" action="/portal/migration-readiness/bootstrap" onsubmit="return confirm('Spustit Bootstrap v2? Tato akce upravuje server přes maintenance job.');"> <form method="post" action="/portal/migration-readiness/bootstrap">
<button type="submit" class="danger">Run Bootstrap v2</button> <input type="hidden" name="mode" value="check">
<button type="submit" class="btn-secondary">Run Bootstrap Check</button>
</form>
<form method="post" action="/portal/migration-readiness/bootstrap" onsubmit="return confirm('Spustit Bootstrap v2 repair? Tato akce opravuje práva přes maintenance job.');">
<input type="hidden" name="mode" value="repair">
<button type="submit" class="btn-secondary">Run Bootstrap Repair</button>
</form> </form>
</div> </div>
</div> </div>
<div class="alert alert-danger"> <div class="alert">
<strong>Bootstrap v2 provádí zásahy do systému.</strong> <strong>Bootstrap v2 má explicitní režimy.</strong>
<ul> <ul>
<li>Opravuje ownership /opt/appfactory.</li> <li><strong>check</strong> bezpečně ověřuje stav bez oprav.</li>
<li>Nastavuje executable práva pro maintenance a alert skripty.</li> <li><strong>repair</strong> opravuje ownership /opt/appfactory a nastavuje executable práva pro maintenance a alert skripty.</li>
<li>Deployuje core services.</li> <li><strong>deploy</strong> provádí plný bootstrap včetně deploy core services a spuštění preflight-check.sh.</li>
<li>Spouští preflight-check.sh.</li>
</ul> </ul>
<p>Portál bootstrap nespouští přímo přes shell. Pouze založí maintenance job pro {html.escape(BOOTSTRAP_SCRIPT)}.</p> <p>Portál bootstrap nespouští přímo přes shell. Pouze založí maintenance job pro {html.escape(BOOTSTRAP_SCRIPT)}.</p>
</div> </div>
<div class="alert alert-danger">
<strong>Plný Bootstrap Deploy není výchozí akce.</strong>
<p>Režim deploy deployuje core services a může změnit stav systému. Spouštějte ho jen po kontrole dopadu.</p>
<form method="post" action="/portal/migration-readiness/bootstrap" onsubmit="return confirm('Spustit plný Bootstrap v2 deploy? Tato akce deployuje core services přes maintenance job.');">
<input type="hidden" name="mode" value="deploy">
<button type="submit" class="danger">Run Bootstrap Deploy</button>
</form>
</div>
<div class="stats-grid"> <div class="stats-grid">
<div class="stat-card {"stat-success" if summary["ready"] else "stat-danger"}"><span>Stav</span><strong>{render_readiness_pill(summary["ready"])}</strong></div> <div class="stat-card {"stat-success" if summary["ready"] else "stat-danger"}"><span>Stav</span><strong>{render_readiness_pill(summary["ready"])}</strong></div>
<div class="stat-card stat-success"><span>OK</span><strong>{html.escape(str(summary["ok_count"]))}</strong></div> <div class="stat-card stat-success"><span>OK</span><strong>{html.escape(str(summary["ok_count"]))}</strong></div>
@@ -163,12 +177,21 @@ def run_migration_readiness(user=Depends(require_user)):
@router.post("/migration-readiness/bootstrap") @router.post("/migration-readiness/bootstrap")
def run_bootstrap_v2(user=Depends(require_user)): def run_bootstrap_v2(mode: str = Form(...), user=Depends(require_user)):
mode = (mode or "").strip().lower()
if mode not in BOOTSTRAP_MODES:
raise HTTPException(status_code=400, detail="Neplatný režim bootstrapu")
job_id = create_job( job_id = create_job(
job_type="run_script", job_type="run_script",
target_type="maintenance_script", target_type="maintenance_script",
target_id=BOOTSTRAP_SCRIPT, target_id=BOOTSTRAP_SCRIPT,
payload={"script_name": BOOTSTRAP_SCRIPT}, payload={
"script_name": BOOTSTRAP_SCRIPT,
"args": [mode],
"arguments": [mode],
"mode": mode,
},
user=user, user=user,
source="portal_manual", source="portal_manual",
) )