Webapp-Mechanismus (Phase 2): Server-seitige DB+API+Favicon-Fetch
Nachtrag: Migration 0030 (App-Store-Batch-1-Merkmale) war im letzten
Commit versehentlich nicht mit dabei - jetzt nachgeholt (git status hat
es aufgedeckt).
Neue Tabelle workspace_webapps (Migration 0032): kundeneigene
{name, url}-Eintraege pro Workspace, kein fester Katalog wie bei
Merkmalen - jede Organisation/jeder Workspace hat ihre/seine eigene
Liste (Nutzer-Anforderung 09.09.2026: 'der Kunde hat diverse URLs').
app.py-Aenderungen:
- fetch_favicon(): bestes-Effort-Ermittlung des Website-Favicons
(erst <link rel=icon> per Regex aus dem HTML, sonst /favicon.ico an
der Domain-Wurzel) - bewusst ohne neue pip-Abhaengigkeit (nur
urllib, passt zum bisher sehr schlanken requirements.txt).
- CRUD-Endpunkte /api/v1/workspaces/{id}/webapps[/{webapp_id}]
(GET/POST/PUT/DELETE), Icon-Serving unter /webapp-icons/{filename}
(unauthentifiziert wie /golden-images/, gleicher
Path-Traversal-Schutz).
- Checkin-Response um 'webapps' erweitert (fetch_workspace_webapps(),
gleiches assignments->bereitstellungsvorlagen-Join-Muster wie
fetch_assigned_blueprints()).
- WICHTIG: Server komponiert nie eine eigene oeffentliche URL (ANODE_URL
ist nur client-seitig bekannt, siehe agent.py/backend.sh) - Checkin
liefert nur den relativen icon_path, der Agent haengt ANODE_URL davor.
Gehört zusammen mit admin/ansible-content (neue Rolle
webapp-shortcuts, echt end-to-end getestet) und admin/kundenplattform
(Admin-UI unter /admin/technik/workspaces/{id}, Icon-Proxy analog zum
bestehenden ISO-Download-Proxy-Muster).
Live auf anode angewendet: Migration 0032 (workspace_webapps-Tabelle).
app.py-Deployment (git pull + Neustart) folgt separat.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
This commit is contained in:
1 parent
ead3535e72
commit
4b229a992b
3 files changed
+416
No files matched your search
@@ -0,0 +1,103 @@
|
||||
BEGIN;
|
||||
|
||||
-- Erste Batch Phase 2 (App-Store-Merkmale, siehe
|
||||
-- project_phase2_app_store_merkmale-Memory): 28 Apps mit regulärem
|
||||
-- Debian/Ubuntu-Paket, per apt-cache auf einer echten Debian-trixie-Quelle
|
||||
-- verifiziert (09.09.2026), kein Flatpak nötig - apt/deb hat laut
|
||||
-- Nutzer-Entscheidung ohnehin Vorrang. Nur die drei apt-basierten Backends
|
||||
-- (mint-image/debian-image/ubuntu-image), Fedora bewusst ausgeklammert.
|
||||
|
||||
INSERT INTO merkmale (id, key, name, description, kategorie_id, im_auftragskatalog) VALUES
|
||||
(gen_random_uuid(), 'gimp', 'GIMP', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'kreativ-grafik'), TRUE),
|
||||
(gen_random_uuid(), 'inkscape', 'Inkscape', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'kreativ-grafik'), TRUE),
|
||||
(gen_random_uuid(), 'scribus', 'Scribus', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'kreativ-grafik'), TRUE),
|
||||
(gen_random_uuid(), 'librecad', 'LibreCAD', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'kreativ-grafik'), TRUE),
|
||||
(gen_random_uuid(), 'audacity', 'Audacity', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'musik-audio'), TRUE),
|
||||
(gen_random_uuid(), 'musescore', 'MuseScore', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'musik-audio'), TRUE),
|
||||
(gen_random_uuid(), 'metronome', 'Metronom', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'musik-audio'), TRUE),
|
||||
(gen_random_uuid(), 'minuet', 'Minuet', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'musik-audio'), TRUE),
|
||||
(gen_random_uuid(), 'stellarium', 'Stellarium', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
||||
(gen_random_uuid(), 'octave', 'GNU Octave', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
||||
(gen_random_uuid(), 'kalgebra', 'KAlgebra', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
||||
(gen_random_uuid(), 'kalzium', 'KAlzium', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
||||
(gen_random_uuid(), 'kbruch', 'KBruch', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
||||
(gen_random_uuid(), 'step', 'Step (Physik-Simulator)', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
||||
(gen_random_uuid(), 'tuxmath', 'Tux Math', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
||||
(gen_random_uuid(), 'filius', 'Filius', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
||||
(gen_random_uuid(), 'gcompris', 'GCompris', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
||||
(gen_random_uuid(), 'ktouch', 'KTouch', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'bildung-sprache-schreiben'), TRUE),
|
||||
(gen_random_uuid(), 'kwordquiz', 'KWordQuiz', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'bildung-sprache-schreiben'), TRUE),
|
||||
(gen_random_uuid(), 'kanagram', 'Kanagram', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'bildung-sprache-schreiben'), TRUE),
|
||||
(gen_random_uuid(), 'tuxtype', 'Tux Typing', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'bildung-sprache-schreiben'), TRUE),
|
||||
(gen_random_uuid(), 'foliate', 'Foliate', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'bildung-sprache-schreiben'), TRUE),
|
||||
(gen_random_uuid(), 'evolution', 'Evolution', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'buero-produktivitaet'), TRUE),
|
||||
(gen_random_uuid(), 'kturtle', 'KTurtle', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'programmieren-making'), TRUE),
|
||||
(gen_random_uuid(), 'fritzing', 'Fritzing', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'programmieren-making'), TRUE),
|
||||
(gen_random_uuid(), 'remmina', 'Remmina', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'internet-kommunikation'), TRUE),
|
||||
(gen_random_uuid(), 'geogebra', 'GeoGebra', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'unterrichtswerkzeuge'), TRUE),
|
||||
(gen_random_uuid(), 'marble', 'Marble', NULL,
|
||||
(SELECT id FROM kategorien WHERE key = 'unterrichtswerkzeuge'), TRUE);
|
||||
|
||||
INSERT INTO blueprints (id, merkmal_id, backend_id, ansible_role)
|
||||
SELECT gen_random_uuid(), m.id, b.id, m.key
|
||||
FROM merkmale m
|
||||
JOIN backends b ON b.key IN ('mint-image', 'debian-image', 'ubuntu-image')
|
||||
WHERE m.key IN (
|
||||
'gimp',
|
||||
'inkscape',
|
||||
'scribus',
|
||||
'librecad',
|
||||
'audacity',
|
||||
'musescore',
|
||||
'metronome',
|
||||
'minuet',
|
||||
'stellarium',
|
||||
'octave',
|
||||
'kalgebra',
|
||||
'kalzium',
|
||||
'kbruch',
|
||||
'step',
|
||||
'tuxmath',
|
||||
'filius',
|
||||
'gcompris',
|
||||
'ktouch',
|
||||
'kwordquiz',
|
||||
'kanagram',
|
||||
'tuxtype',
|
||||
'foliate',
|
||||
'evolution',
|
||||
'kturtle',
|
||||
'fritzing',
|
||||
'remmina',
|
||||
'geogebra',
|
||||
'marble'
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
Reference in new issue
Block a user