import html from fastapi import APIRouter, Depends from fastapi.responses import HTMLResponse from ..auth import require_user from ..config import DEFAULT_GITEA_ORG, get_gitea_public_url, read_env_value from ..templates.layout import page router = APIRouter() # Portal sections (the admin/agenda links shown in the navigation). role: minimum role that can # actually use the section; viewers may see read-only data where a section allows it. PORTAL_SECTIONS = [ ("fa-server", "Služby", "/portal/apps", "Přehled nasazených služeb: stav, dokumentace, prostředky (RAM/CPU), Git a akce.", "viewer (čtení) / developer / admin"), ("fa-list-check", "Úlohy", "/portal/jobs", "Fronta a historie úloh (nasazení, skripty) včetně stavů a logů.", "developer / admin"), ("fa-calendar-days", "Plánované skripty", "/portal/scheduled-scripts", "Cron-like skripty spouštěné na pozadí; úpravy jen pro administrátory.", "developer / admin"), ("fa-bell", "Alerting", "/portal/alerting/rules", "Pravidla alertů a jejich skripty; úpravy jen pro administrátory.", "developer / admin"), ("fa-gauge-high", "Přehled", "/portal/operations", "Operační přehled systému, běžící nasazení a stav služeb.", "admin"), ("fa-server", "Runtime Management", "/portal/admin/runtime", "Redeploy core služeb (Portal, Worker, Webhook, Monitor, Gateway, Gitea, Registry) přes deploy-core-service.sh v job frontě.", "admin"), ("fa-sliders", "Environment", "/portal/admin/environment", "Bezpečná úprava hlavního appfactory.env (backup, validace) + navazující restart/regenerate akce přes job frontu.", "admin"), ("fa-diagram-project", "Migration Readiness", "/portal/migration-readiness", "Připravenost a deploy core služeb AppFactory.", "admin"), ("fa-rocket", "Nasazení", "/portal/deployments", "Historie deploy běhů, stavů a výstupů z deploy procesu.", "developer / admin"), ("fa-triangle-exclamation", "Incidenty", "/portal/incidents", "Evidované incidenty služeb.", "developer / admin"), ("fa-gears", "Workery", "/portal/workers", "Stav workerů zpracovávajících úlohy.", "admin"), ("fa-users", "Users", "/portal/admin/users", "Správa uživatelů a rolí (viewer / developer / admin).", "admin"), ("fa-clipboard-list", "Audit", "/portal/audit", "Auditní log akcí provedených v portálu.", "admin"), ("fa-box-archive", "Zálohy", "/portal/backups", "Vytváření, stažení a obnova záloh AppFactory. Obnova je jen pro administrátory.", "admin"), ] # Public / API endpoints not gated by the portal login. PUBLIC_ENDPOINTS = [ ("GET", "/apps", "Veřejný JSON katalog služeb (název + odkaz na dokumentaci). Routuje se přes Caddy."), ("GET", "/portal/health", "Health endpoint portálu (HTTP 200, pokud portál běží)."), ("GET", "/apps/<app-id>/docs", "Swagger/OpenAPI dokumentace konkrétní služby."), ("GET", "/apps/<app-id>/health", "Health endpoint konkrétní služby."), ] # Roles model. ROLES = [ ("guest", "Výchozí role nového účtu po prvním přihlášení. Bez přístupu – vidí jen výzvu požádat administrátora o přidělení práv."), ("viewer", "Pouze pro čtení: vidí jaké služby běží a jejich dokumentaci (Swagger). Bez Gitu, úprav, nasazení a mazání."), ("developer", "Vše co viewer + provozní workflow služeb: Git/klonování, nasazení, proměnné, prostředky, metadata. Nemůže mazat služby ani do Administrace."), ("admin", "Plný přístup: vše co developer + mazání služeb, správa záloh a jejich obnova, správa uživatelů, audit a admin-only operace."), ] @router.get("/developers", response_class=HTMLResponse) def developers_page(user=Depends(require_user)): section_rows = "" for icon, title, href, desc, roles in PORTAL_SECTIONS: section_rows += f"""
{html.escape(href)}{path}
Přehled všech sekcí portálu, veřejných endpointů a rolí. Portál běží za reverzní proxy
na cestě /portal; jednotlivé služby na /apps/<app-id>.
Postup od založení nové služby po nasazení změn.
AGENTS.md v kořenové složce projektu, nebo úpravy
nechte provést AI (agent si AGENTS.md přečte sám).
| Sekce | Odkaz | Popis | Role |
|---|
| Metoda | Cesta | Popis |
|---|
Veřejný katalog /apps vrací JSON se seznamem služeb a odkazy na jejich dokumentaci.
| Role | Co může |
|---|