Register apps before queued deployment

This commit is contained in:
JiriUhlir
2026-06-03 10:38:23 +02:00
parent 0a37507d86
commit 46f8024d4e
4 changed files with 334 additions and 15 deletions
+95 -15
View File
@@ -25,7 +25,7 @@ from ..db.apps import (
get_apps,
update_app_metadata,
update_app_resources,
update_app_template_metadata,
upsert_created_app,
update_app_variable,
)
from ..db.audit import log_audit_event
@@ -893,7 +893,7 @@ def new_app_form(request: Request, user=Depends(require_user)):
<h2>Vytvořit novou službu</h2>
<p class="muted">Vytvoří Gitea repozitář, webhook, lokální workspace, první commit a nasadí službu.</p>
<form method="post" action="/portal/new-app">
<form method="post" action="/portal/new-app" id="new-app-form" data-ajax-form="new-app">
<p>
<label>ID služby</label><br>
<input name="app_id" placeholder="gmail-service" required>
@@ -909,8 +909,16 @@ def new_app_form(request: Request, user=Depends(require_user)):
<select name="template" required>{template_options}</select>
</p>
<button type="submit">Vytvořit službu</button>
<div class="form-actions">
<button type="submit">Vytvo&rcaron;it slu&zcaron;bu</button>
<span class="form-loader" id="new-app-loader" hidden>
<span class="spinner" aria-hidden="true"></span>
Vytv&aacute;&rcaron;&iacute;m slu&zcaron;bu...
</span>
</div>
<div class="async-status" id="new-app-status" aria-live="polite"></div>
</form>
<div id="new-app-result"></div>
<p><a href="/portal/apps">&larr; Zpět</a></p>
</div>
@@ -924,6 +932,10 @@ def create_app(
app_id: str = Form(...),
app_name: str = Form(...),
template: str = Form(...),
description: str = Form(""),
owner: str = Form(""),
memory: str = Form(""),
cpus: str = Form(""),
user=Depends(require_user),
):
selected_template = get_app_template(template, create_enabled=True)
@@ -934,22 +946,91 @@ def create_app(
return HTMLResponse("Šablona nemá nastavený create script", status_code=400)
create_result = run_command([create_script, app_id, app_name])
if create_result.returncode == 0:
update_app_template_metadata(
if create_result.returncode != 0:
log_audit_event(
user,
action="create_app",
target_type="app",
target_id=app_id,
metadata={
"app_id": app_id,
"app_name": app_name,
"template": selected_template.get("id"),
"status": "FAILED",
"create_returncode": create_result.returncode,
},
)
return render_result(
title="Vytvoření služby: FAILED",
back_url="/portal/apps",
sections=[
("Výstup vytvoření", create_result.stdout),
("Chyba vytvoření", create_result.stderr),
],
user=user,
)
gitea_url = read_env_value("GITEA_URL", "").rstrip("/")
gitea_org = read_env_value("GITEA_ORG", DEFAULT_GITEA_ORG)
repository_url = f"{gitea_url}/{gitea_org}/{app_id}.git" if gitea_url else None
owner_value = clean_optional(owner) or user.get("display_name") or user.get("username") or None
try:
upsert_created_app(
app_id,
{
"name": app_name,
"template": selected_template.get("id"),
"runtime": selected_template.get("runtime"),
"language": selected_template.get("language"),
"version": "1.0.0",
"status": "created",
"memory": clean_optional(memory),
"cpus": clean_optional(cpus),
"description": clean_optional(description),
"owner": owner_value,
"repository_name": app_id,
"repository_url": repository_url,
"default_branch": "main",
"health_url": selected_template.get("default_health_path"),
"container_port": selected_template.get("default_port"),
"is_public": True,
"is_enabled": True,
},
)
deploy_script = clean_optional(selected_template.get("deploy_script")) or DEPLOY_SCRIPT
deploy_result = run_command([deploy_script, app_id])
except Exception as exc:
log_audit_event(
user,
action="create_app",
target_type="app",
target_id=app_id,
metadata={
"app_id": app_id,
"app_name": app_name,
"template": selected_template.get("id"),
"status": "FAILED",
"create_returncode": create_result.returncode,
"registration_error": str(exc),
},
)
return render_result(
title="Registrace služby: FAILED",
back_url="/portal/apps",
sections=[
("Výstup vytvoření", create_result.stdout),
("Chyba vytvoření", create_result.stderr),
("Chyba registrace", str(exc)),
],
user=user,
)
status = "OK" if create_result.returncode == 0 and deploy_result.returncode == 0 else "FAILED"
job_id = create_job(
job_type="deploy_app",
target_type="app",
target_id=app_id,
payload={"template": selected_template.get("id")},
user=user,
source="portal",
)
log_audit_event(
user,
action="create_app",
@@ -959,23 +1040,22 @@ def create_app(
"app_id": app_id,
"app_name": app_name,
"template": selected_template.get("id"),
"status": status,
"status": "OK",
"create_returncode": create_result.returncode,
"deploy_returncode": deploy_result.returncode,
"job_id": job_id,
},
)
return render_result(
title=f"Vytvoření služby: {status}",
title="Vytvoření služby: OK",
back_url="/portal/apps",
sections=[
("Výstup vytvoření", create_result.stdout),
("Chyba vytvoření", create_result.stderr),
("Výstup nasazení", deploy_result.stdout),
("Chyba nasazení", deploy_result.stderr),
("Nasazení", f"Deploy job #{job_id} byl zařazen do fronty."),
],
extra_link=f"/apps/{html.escape(app_id)}/docs",
extra_label="Otevřít Swagger",
extra_link=f"/portal/jobs/{job_id}",
extra_label="Otevřít deploy job",
user=user,
)