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.
JiriUhlir
2026-06-10 09:34:56 +02:00
38edf07ff3
Hotovo. V config.py (line 50) jsem upravil default fallbacky: Google: APPFACTORY_PORTAL_PUBLIC_URL + PORTAL_PREFIX + /auth/google/callback Gitea: APPFACTORY_PORTAL_PUBLIC_URL + PORTAL_PREFIX + /auth/gitea/callback Explicitní env hodnoty GOOGLE_REDIRECT_URI a GITEA_OAUTH_REDIRECT_URI zůstávají respektované beze změny. Caddyfile ani login endpointy jsem neupravoval.
JiriUhlir
2026-06-10 08:55:59 +02:00
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.
JiriUhlir
2026-06-10 08:37:42 +02:00
9cec3d001f
sprava uzivatelu
JiriUhlir
2026-06-10 07:56:02 +02:00
7dffff17c7
Odstranil jsem hardcoded IP fallbacky z portálového Python kódu: DEFAULT_APPFACTORY_HOST = "192.168.66.130" je pryč z config.py (line 10). DEFAULT_GITEA_URL = "http://192.168.66.130:3000" je pryč z auth.py (line 24). Doplněné chování: APPFACTORY_HOST se odvozuje přes helper: env APPFACTORY_HOST, potom APPFACTORY_PORTAL_PUBLIC_URL, potom request host. Gitea browser redirect používá jen explicitní veřejnou URL z GITEA_URL nebo GITEA_ROOT_URL. Server-side Gitea token/userinfo requesty používají GITEA_URL, potom GITEA_ROOT_URL, jinak interní Docker URL http://appfactory-gitea:3000. Gitea login tlačítko se zobrazí jen při kompletní konfiguraci: public URL, client id, client secret a redirect URI. Přímý Gitea login bez kompletní konfigurace vrací čitelnou chybu.
JiriUhlir
2026-06-08 11:38:57 +02:00
9916e4d833
Změny: Přidaná centrální runtime konfigurace public URL, HTTPS a Google OAuth readiness v config.py (line 37). Google OAuth přidaný jako volitelná další možnost přihlášení, bez nahrazení lokálního/Gitea loginu, v auth.py (line 128). Default Google redirect URI se skládá z APPFACTORY_PORTAL_PUBLIC_URL + /auth/google/callback, bez hardcoded IP/localhost/domény. Readiness JSON endpoint přidán na /portal/migration-readiness/auth-domain-config; vrací jen boolean hodnoty, žádné secrety, v migration_readiness.py (line 112). UI sekce Auth & Domain Readiness přidaná do Migration Readiness v migration_readiness.py (line 41). Audit event auth_domain_readiness.viewed se zapisuje při zobrazení readiness stránky v migration_readiness.py (line 133). APPFACTORY_ENABLE_HTTPS se promítá i do secure session cookies v main.py (line 19).
JiriUhlir
2026-06-08 11:21:29 +02:00
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.
JiriUhlir
2026-06-08 08:15:27 +02:00
2571e6e50e
Bootstrap v2 už nejde spustit bez režimu:
JiriUhlir
2026-06-08 08:08:14 +02:00
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.
JiriUhlir
2026-06-08 08:02:56 +02:00
ad0b35c09f
Upraveno. Portál už neurčuje readiness podle job.status == success ani podle žádné Docker/group logiky.
JiriUhlir
2026-06-08 07:53:21 +02:00
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í
JiriUhlir
2026-06-08 06:57:12 +02:00
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
JiriUhlir
2026-06-03 12:33:37 +02:00
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
JiriUhlir
2026-06-03 12:18:39 +02:00
46f8024d4e
Register apps before queued deployment
JiriUhlir
2026-06-03 10:38:23 +02:00
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].
JiriUhlir
2026-06-03 09:23:59 +02:00
54c86702d2
Co se změnilo:
JiriUhlir
2026-06-03 09:02:36 +02:00