Commit Graph

49 Commits

Author SHA1 Message Date
JiriUhlir 2571e6e50e 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í.
2026-06-08 08:08:14 +02:00
JiriUhlir 6622db2fb3 Hotovo. Přidal jsem podporu bootstrap-v2.sh do stránky Migration Readiness.
Co se změnilo:
migration_readiness.py (line 9) nově zná BOOTSTRAP_SCRIPT = "bootstrap-v2.sh".
Helper umí najít poslední job pro bootstrap a připravit status, return code, started_at, finished_at, raw stdout/stderr z DB.
routes/migration_readiness.py (line 111) přidává tlačítko Run Bootstrap v2, které pouze vytvoří run_script job s script_name=bootstrap-v2.sh.
Přidal jsem výrazné varování k bootstrapu a blok “Poslední výsledek Bootstrap v2”.
Zobrazení logů redaktuje env-like citlivé hodnoty typu TOKEN, PASSWORD, SECRET, API_KEY, PRIVATE, CREDENTIAL.
2026-06-08 08:02:56 +02:00
JiriUhlir ad0b35c09f Upraveno. Portál už neurčuje readiness podle job.status == success ani podle žádné Docker/group logiky.
Teď READY / NOT READY bere jen z explicitního výstupu skriptu uloženého v DB:

result_json.ready jako boolean,
result_json.readiness / migration_readiness s hodnotou READY nebo NOT READY,
případně text READY / NOT READY v uloženém raw výstupu jobu.
2026-06-08 07:53:21 +02:00
JiriUhlir 2f5b5bcb89 readinness 2026-06-08 07:49:06 +02:00
JiriUhlir 382825085f Hotovo. Přidal jsem správu Alertingu do appfactory-portal bez ORM:
Nové SQL migrace pro alert_rules a alert_events v migrations.py (line 165).
Nová ruční DB vrstva v alerting.py (line 7).
Nové stránky a akce v routes/alerting.py (line 288):Alert pravidla, detail, vytvoření, úprava, smazání
povolit/zakázat pravidlo
Alert eventy a detail eventu s payload_json
odkazy z job_id na detail úlohy
detail pravidla s posledními eventy
admin-only editor .sh alert skriptů v /opt/appfactory/workspace/appfactory-tools/alerts
audit eventy podle zadání

Menu Provoz → Alerting v layout.py (line 23).
Router je zaregistrovaný v main.py (line 8).
2026-06-08 06:57:12 +02:00
JiriUhlir 64f8fe806d Hotovo. Do detailu plánovaného skriptu jsem přidal sekci Obsah skriptu.
Implementováno v app/routes/scheduled_scripts.py:
bezpečné načtení pouze z /opt/appfactory/workspace/appfactory-tools/maintenance/{script_name},
validace script_name: .sh, bez /, \, .., neprázdné,
zobrazení obsahu v textarea,
pokud soubor neexistuje, zobrazí se hláška a výchozí obsah:bash

#!/usr/bin/env bash
set -euo pipefail

echo "TODO"

admin může obsah uložit přes POST /portal/scheduled-scripts/{id}/script,
neadmin vidí read-only editor,
obsah nesmí být prázdný ani větší než 100 KB,
pokud chybí shebang #!/usr/bin/env bash, automaticky se doplní,
po uložení se nastaví chmod 755,
audit event scheduled_script.file_updated s scheduled_script_id a script_name.
Tlačítko Spustit nyní zůstává na detailu dostupné.
2026-06-03 12:33:37 +02:00
JiriUhlir f7a8007af8 Změny:
Nový DB helper bez ORM: app/db/scheduled_scripts.py
Nové route/UI: app/routes/scheduled_scripts.py
Router registrovaný v app/main.py
Menu doplněné v app/templates/layout.py
Job filtr rozšířený o run_script v app/routes/jobs.py
Implementováno:
GET /portal/scheduled-scripts
GET /portal/scheduled-scripts/{id}
GET/POST /portal/scheduled-scripts/new
GET/POST /portal/scheduled-scripts/{id}/edit
POST /portal/scheduled-scripts/{id}/run-now
POST /portal/scheduled-scripts/{id}/toggle
POST /portal/scheduled-scripts/{id}/delete
Ruční spuštění vytváří run_script job přes existující create_job(...) se source="portal_manual" a payloadem podle zadání. Mazání je blokované, pokud is_running = 1. Validace script_name, schedule_type a timeout_seconds je v route vrstvě.
Audit eventy jsou přidané:
scheduled_script.created
scheduled_script.updated
scheduled_script.deleted
scheduled_script.enabled
scheduled_script.disabled
scheduled_script.run_now
2026-06-03 12:18:39 +02:00
JiriUhlir 46f8024d4e Register apps before queued deployment 2026-06-03 10:38:23 +02:00
JiriUhlir 0a37507d86 Změny:
NEW_APP_SCRIPT odstraněn z app/config.py.
create_app už volá skeleton přes app_templates.create_script:načte template podle ID,
ověří is_enabled = 1 a create_enabled = 1 přes get_app_template(..., create_enabled=True),
ověří neprázdný create_script,
volá [create_script, app_id, app_name].

runtime, language, container_port, health_url dál bere z vybraného template řádku.
DB helper a migrace znají nové sloupce create_script a deploy_script.
deploy_script se při create použije, pokud je v template vyplněný; jinak zůstává dosavadní deploy fallback.
2026-06-03 09:23:59 +02:00
JiriUhlir 54c86702d2 Co se změnilo:
app_templates je teď jediný source of truth.
Detail služby načítá šablony přes is_enabled = 1.
Vytvoření služby načítá šablony přes is_enabled = 1 AND create_enabled = 1.
Select hodnoty používají app_templates.id, takže fastapi odpovídá existující službě microsoft-365-service.
Při vytvoření služby se z vybrané šablony nastaví template, runtime, language, container_port a health_url.
Neznámá šablona se zobrazí jako Neznámá šablona a detail nespadne.
Hardcoded python-fastapi / seznam šablon byl odstraněn.
2026-06-03 09:02:36 +02:00
JiriUhlir 786d055f6b Přidáno:
tlačítko Přihlásit přes Gitea na login stránku
zachovaný lokální login jako nouzový admin fallback
GET /portal/auth/gitea/login
GET /portal/auth/gitea/callback
OAuth state přes session a ověření přes secrets.compare_digest
výměna code za token a načtení /api/v1/user
mapování Gitea uživatele do users bez ORM
nové Gitea účty dostanou role = developer, existující role se zachová
disabled user is_active = 0 se nepřihlásí
audit eventy auth.gitea.login.started, auth.gitea.login.success, auth.gitea.login.failed
bezpečné chybové hlášky bez detailů a bez zobrazení client secretu
2026-06-01 13:53:06 +02:00
JiriUhlir 6aa5e69ee4 Přidáno:
nová stránka /portal/incidents s title CSBot Services Portal - Incidenty
menu Provoz -> Incidenty
aktivní incidenty a historie posledních 100 incidentů
barevné stavy: open červeně, resolved zeleně
karta Aktivní incidenty a seznam Poslední incidenty na přehledu
realtime napojení přes existující operations-live.js a snapshot
sekce Incidenty služby v detailu služby, posledních 20 incidentů
DB helpery pro service_incidents
migrace/indexy pro lokální prostředí, kde tabulka ještě neexistuje
2026-06-01 13:38:06 +02:00
JiriUhlir 994171be1a feat(portal): add app metadata and variables management 2026-06-01 13:13:17 +02:00
JiriUhlir 1ade865df4 update seznamu sluzeb 2026-05-29 12:07:13 +02:00
JiriUhlir ed194093e6 Přidal jsem Health Monitoring do portálu:
Přehled má nové karty: Zdravé služby, Nezdravé služby, Nedostupné služby.
Přehled zobrazuje sekci Služby vyžadující pozornost pro unhealthy a unreachable.
Snapshot /portal/ws/operations teď obsahuje health data a stránka je aktualizuje přes existující realtime vrstvu.
Seznam služeb zobrazuje aktuální health status a poslední kontrolu, včetně řazení Podle zdraví.
Detail služby má sekce Zdraví služby a Historie kontrol s posledními 50 záznamy.
Přidal jsem audit event service.health.view.
Browser title teď používá formát CSBot Services Portal - ..., takže detail služby odpovídá požadavku.
Nepoužil jsem ORM, vše je přes SQLite dotazy.
2026-05-29 11:57:57 +02:00
JiriUhlir 56f0b632de navigace 2026-05-29 11:42:46 +02:00
JiriUhlir 064ae93831 Upravil jsem:
responzivitu layoutu, menu, karet, filtrů, tlačítek, tabulek a log panelů v styles.css
tabulky se na menších šířkách horizontálně posouvají místo rozbíjení layoutu
menu má teď přímé položky Přehled, Služby a rozbalovací skupiny Provoz, Správa
stránkování se vůbec nezobrazuje, pokud existuje jen jedna stránka
Předchozí / Další se nezobrazují, když daný směr není dostupný
odstranil jsem staré neaktivní disabled pagination odkazy
2026-05-29 11:40:09 +02:00
JiriUhlir 6109bdfe61 cestina, UI, UX 2026-05-29 11:34:07 +02:00
JiriUhlir d145161e4e Add unified operations realtime dashboard
- add /portal/ws/operations WebSocket snapshot endpoint
- add shared operations-live.js with reconnect and operations:snapshot events
- update Operations, Jobs, and Workers pages to use realtime snapshots
- keep job detail live logs on dedicated /ws/jobs/{job_id}/logs endpoint
- add Jobs and Workers pagination/filtering
- remove old page auto-refresh behavior from jobs/deployments
- normalize main navigation labels
- move New App CTA from menu to Apps page
- add backup download action for admins
- add Workers pages and operations dashboard data helpers
2026-05-29 11:17:17 +02:00
JiriUhlir 0dcf9b7b05 life jobs logs 2026-05-29 11:02:43 +02:00
JiriUhlir e3019bd76e download backup admin possibility 2026-05-29 10:56:20 +02:00
JiriUhlir 6e5d9b3120 operations 2026-05-29 10:44:25 +02:00
JiriUhlir 3804bb32c4 workers fix 2026-05-29 10:40:15 +02:00
JiriUhlir 48a9b20379 workers 2026-05-29 10:35:56 +02:00
JiriUhlir 765c840120 kontrola na jobs na nedoployovatelne repositare 2026-05-29 09:30:54 +02:00
JiriUhlir 4b4bf55696 filtry v jobs a shrnuti 2026-05-29 09:23:36 +02:00
JiriUhlir f651f7efd6 added jobs handling. 2026-05-29 09:16:37 +02:00
JiriUhlir 88601451dc Implementována portálová část SQLite job queue.
Přidán DB helper pro jobs a job_logs bez ORM.
Přidána idempotentní migrace pro job tabulky včetně created_by_display_name.
Přidány stránky /portal/jobs a /portal/jobs/{id}.
Jobs page zobrazuje status, type, target, source, created_by, created_at, started_at, finished_at.
Job detail zobrazuje payload, result/error a job_logs.
Queued/running joby mají auto-refresh po 5 s.
Navigace portálu obsahuje odkaz na Joby.
App redeploy už nespouští deploy script přímo; vytváří queued job deploy_app s prázdným payloadem.
Po redeploy se uživatel přesměruje na detail jobu.
Přidán audit event app.redeploy.queued s metadata={"job_id": job_id}.
Přidána ochrana proti duplicitnímu aktivnímu deploy jobu pro stejnou appku.
2026-05-28 14:02:49 +02:00
JiriUhlir 17a4d4db1b copying, evidovat btn hidden 2026-05-28 13:33:22 +02:00
JiriUhlir 8624352253 strankovani u deploys a styly pro pocitadla 2026-05-28 13:26:58 +02:00
JiriUhlir e6ffeb8fef deployment observability, filters, stats, details 2026-05-28 13:22:51 +02:00
JiriUhlir 80d82d36dd audit logging 2026-05-28 11:49:59 +02:00
JiriUhlir f18aabb5ba Add portal authentication and removed deploy old templates 2026-05-28 11:45:29 +02:00
JiriUhlir aa103bc129 Merge branch 'main' of http://192.168.66.130:3000/appfactory/appfactory-portal 2026-05-28 11:40:52 +02:00
JiriUhlir 09c742fefb auth via DB 2026-05-28 11:40:49 +02:00
AppFactory Bot 915ee48131 Use database as apps source and add deployments UI 2026-05-28 10:14:22 +02:00
JiriUhlir db039e5988 Read apps and resources from database 2026-05-28 10:11:31 +02:00
JiriUhlir a2edca2fec deploz statuses css 2026-05-28 10:08:59 +02:00
JiriUhlir 08f3fc1e83 apps change 2026-05-28 10:07:22 +02:00
JiriUhlir 614ccb5e71 styles combine 2026-05-28 10:02:25 +02:00
AppFactory Bot 198f68381e Fix template response usage 2026-05-28 09:53:39 +02:00
JiriUhlir f32216848d Register deployments route 2026-05-28 09:48:44 +02:00
AppFactory Bot 3a40eb02a6 Add portal database layer 2026-05-28 09:44:54 +02:00
JiriUhlir 182d8d3c4c hidden style 2026-05-27 13:15:33 +02:00
JiriUhlir 3e1d1f5360 cz texty 2026-05-27 13:09:34 +02:00
JiriUhlir dcc1a2f3ad csbot styly 2026-05-27 13:01:56 +02:00
JiriUhlir 8585690de0 styles update 2026-05-27 12:49:00 +02:00
JiriUhlir 2b20444324 rozdeleni do struktury 2026-05-27 12:15:11 +02:00
AppFactory Bot 12f6323185 Initial AppFactory portal service 2026-05-27 12:05:33 +02:00