Commit Graph

38 Commits

Author SHA1 Message Date
JiriUhlir f67a3fc993 novy prehled prirazovani IP apod. 2026-07-30 07:13:12 +02:00
JiriUhlir 44a36ffb20 scheduled fix 2026-06-23 07:33:31 +02:00
JiriUhlir 7897e3b876 gitea user and pswd, some pages removed, logs 2026-06-17 11:39:52 +02:00
JiriUhlir bad55a7d41 fixes + guest 2026-06-16 10:23:43 +02:00
JiriUhlir fa4307852c icons, main .env 2026-06-15 14:07:16 +02:00
JiriUhlir 39d9ed394d depl 2026-06-15 12:04:59 +02:00
JiriUhlir a948324b2e dev fix, ip controls 2026-06-15 11:08:31 +02:00
JiriUhlir 5d12028a97 mazani uzivatelu 2026-06-12 09:58:52 +02:00
JiriUhlir b1263edac6 Změny:
users migrace má nové sloupce gitea_user_id, gitea_sync_status, gitea_sync_error, gitea_synced_at.
Přidal jsem gitea_provisioning.py, který přes Gitea API vytváří, aktivuje, deaktivuje a synchronizuje účty.
Role viewer Gitea účet nemá; developer a admin účet mají.
Změny role a enable/disable v administraci spouští sync do Gitea.
Admin UI v routes/users.py zobrazuje stav Gitea synchronizace a má ruční Sync Gitea.
Google login po přihlášení dorovnává Gitea stav podle portálového uživatele.
Gitea OAuth login je v portálu vypnutý; endpointy zůstaly, ale vrací hlášku, že se má použít Google.
Lokální login se zobrazuje/povolí jen při explicitním AUTH_MODE=local.
Gitea API token se čte z GITEA_ADMIN_TOKEN, případně fallback GITEA_API_TOKEN nebo GITEA_TOKEN. Podřízené Gitea username je deterministicky portal-{user_id}, portálová tabulka zůstává zdroj pravdy.
Ověření: python -m py_compile prošel pro všechny upravené Python soubory.
2026-06-10 09:34:56 +02:00
JiriUhlir 272b1eb883 Upravil jsem Google OAuth tak, že Google uživatel se hledá/vytváří přes email, ukládá auth_provider='google', provider_subject, display_name, avatar_url a po úspěšném loginu last_login_at. První Google uživatel v prázdné users tabulce dostane admin, další noví Google uživatelé viewer.
Přidal jsem AUTH_MODE=google|mixed|local:

google: jen Google login, lokální/Gitea nejdou ani přes přímý endpoint
mixed: Google + lokální/Gitea fallback
local: jen lokální login
Správa uživatelů zůstává admin-only, guard posledního admina platí pro odebrání role i deaktivaci. Přidal jsem do ní i přehled oprávnění rolí a zobrazení provider/avatar metadat.

DB migrace teď přes PRAGMA table_info(users) doplňuje chybějící sloupce bez mazání/recreate existující tabulky; pokud users vůbec neexistuje, bezpečně ji vytvoří. Podporované sloupce zahrnují email, display_name, role, is_enabled, created_at, updated_at, last_login_at, auth_provider, provider_subject, plus kompatibilní sloupce pro lokální login.
2026-06-10 08:37:42 +02:00
JiriUhlir 9cec3d001f sprava uzivatelu 2026-06-10 07:56:02 +02:00
JiriUhlir f101d91821 Upraveno. Portál už nečte ani neinterpretuje READY/NOT READY z textu výstupu a nepřidává žádnou logiku pro disk, backup, Gitea ani Registry.
Změny:
migration_readiness.py (line 140) teď určuje READY pouze jako returncode == 0; chybějící nebo nenulový return code je NOT READY.
Preflight UI v routes/migration_readiness.py (line 85) zobrazuje Return code, summary OK/WARN/FAIL a oddělené raw stdout / stderr.
Odstraněná vlastní logika, která hledala READY/NOT READY ve výstupu skriptu.
2026-06-08 08:15:27 +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 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 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 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 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 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 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 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 db039e5988 Read apps and resources from database 2026-05-28 10:11:31 +02:00
JiriUhlir 08f3fc1e83 apps change 2026-05-28 10:07:22 +02:00
AppFactory Bot 3a40eb02a6 Add portal database layer 2026-05-28 09:44:54 +02:00