Skip to content

Architektur-Übersicht

Audience: Dev, Ops
You will learn: - Systemkontext und Stakeholder des Icon-Tools - Container- und Komponenten-Architektur (C4 Level 1-2) - Runtime-Verhalten und Deployment-Szenarien - Architektonische Entscheidungen und Begründungen

Pre-requisites: - Grundverständnis von Web-Architekturen - Erfahrung mit Node.js und Python/Flask - Produktübersicht gelesen

Systemkontext (C4 Level 1)

C4Context
    title Systemkontext - ak Systems Icon Management Tool

    Person(dev, "Frontend-Entwickler", "Benötigt Icons für Web-Projekte")
    Person(designer, "UI/UX Designer", "Überblickt verfügbare Icons")
    Person(admin, "Admin", "Verwaltet Icon-Bibliothek")

    System(iconTool, "Icon Management Tool", "Zentrale Icon-Bibliothek mit Web-Interface")

    System_Ext(fontawesome, "FontAwesome", "Quell-Icon-Bibliothek")
    System_Ext(projects, "ak Systems Projekte", "Web-Anwendungen die Icons nutzen")

    Rel(dev, iconTool, "Downloads Icons, nutzt Web-Interface")
    Rel(designer, iconTool, "Durchsucht verfügbare Icons")
    Rel(admin, iconTool, "Verwaltet und erweitert Bibliothek")

    Rel(iconTool, fontawesome, "Extrahiert SVG-Icons")
    Rel(projects, iconTool, "Integriert heruntergeladene Icons")

Evidenz: replit.md:1-17, app.py:1-67, package.json:12-16

Container-Architektur (C4 Level 2)

C4Container
    title Container-Architektur

    Person(user, "Benutzer")

    Container_Boundary(iconTool, "Icon Management Tool") {
        Container(webapp, "Web Application", "Flask/Python", "Icon-Browser und API")
        Container(extractor, "Icon Extractor", "Node.js", "SVG-Extraktion aus FontAwesome")
        Container(storage, "File Storage", "File System", "SVG-Dateien und Metadaten")
    }

    System_Ext(fontawesome, "FontAwesome NPM", "Icon-Quell-Bibliothek")
    System_Ext(browser, "Web Browser", "Benutzer-Interface")

    Rel(user, browser, "Nutzt")
    Rel(browser, webapp, "HTTP/JSON API")
    Rel(webapp, storage, "Liest SVG-Dateien und Metadaten")
    Rel(extractor, fontawesome, "Importiert Icons")
    Rel(extractor, storage, "Schreibt SVG-Dateien")

Evidenz: app.py:15-43, extract-icons.js:1-270, icons.json:1-206

Komponenten-Architektur

1. Node.js Icon Extractor

graph TB
    A[FontAwesome Icons] --> B[Icon Mapper]
    B --> C[SVG Generator]
    C --> D[File Writer]
    D --> E[ZIP Creator]

    F[icons.json] --> B
    G[extract-icons.js] --> B

    subgraph "Output"
        H[SVG Files]
        I[ZIP Archive]
    end

    D --> H
    E --> I

Technische Details: - Sprache: JavaScript (Node.js) - Dependencies: FontAwesome SVG Core, Archiver - Input: FontAwesome Icon-Definitionen - Output: SVG-Dateien + ZIP-Archive

Evidenz: extract-icons.js:1-20, package.json:12-16

2. Flask Web Application

graph TB
    A[HTTP Request] --> B[Flask Router]
    B --> C[Icon Service]
    C --> D[File System]
    C --> E[JSON Metadata]

    subgraph "Endpoints"
        F[/ - Web Interface]
        G[/api/icons - JSON API]
        H[/icon/<name> - Single Icon]
    end

    B --> F
    B --> G
    B --> H

    I[Templates] --> F
    J[Static Files] --> F

Technische Details: - Sprache: Python 3.11+ - Framework: Flask 3.1.1+ - Rendering: Jinja2 Templates - API: RESTful JSON

Evidenz: app.py:1-67, pyproject.toml:6-8

3. File Storage Layer

static/
├── icons/              # 162 SVG-Dateien
│   ├── home.svg
│   ├── user.svg
│   └── ...
└── images/             # UI-Assets

icons.json              # Kategorie-Metadaten
templates/
└── index.html          # Web-Interface Template

Evidenz: ls-Output, icons.json:1-206

Runtime-Verhalten

Icon-Extraktion Workflow

sequenceDiagram
    participant Admin
    participant ExtractScript as extract-icons.js
    participant FontAwesome
    participant FileSystem

    Admin->>ExtractScript: node extract-icons.js
    ExtractScript->>FontAwesome: Import icon definitions
    FontAwesome-->>ExtractScript: SVG path data

    loop For each icon
        ExtractScript->>ExtractScript: Generate SVG with currentColor
        ExtractScript->>FileSystem: Write SVG file
    end

    ExtractScript->>FileSystem: Create ZIP archive
    ExtractScript-->>Admin: Success message + stats

Performance-Charakteristika: - Execution Time: ~2-3 Sekunden für 162 Icons - Output Size: 69KB ZIP-Archiv - Memory Usage: <50MB Peak

Evidenz: extract-icons.js:1-270, replit.md:89

Web-Interface Workflow

sequenceDiagram
    participant Browser
    participant Flask
    participant FileSystem
    participant IconJSON

    Browser->>Flask: GET /
    Flask->>FileSystem: List SVG files
    Flask->>IconJSON: Load categories
    Flask->>Flask: Merge icon data
    Flask-->>Browser: HTML + icon grid

    Browser->>Flask: GET /api/icons
    Flask->>FileSystem: Scan icons directory
    Flask->>IconJSON: Load metadata
    Flask-->>Browser: JSON response

Performance-Charakteristika: - Response Time: <100ms für Icon-Liste - Concurrent Users: 10+ bei single-thread Flask - Memory Usage: ~30MB Flask process

Evidenz: app.py:15-64

Deployment-Architektur

Development Setup

graph TB
    subgraph "Developer Machine"
        A[Local Repository]
        B[Node.js Runtime]
        C[Python Runtime]
        D[Local File System]
    end

    A --> B
    A --> C
    B --> D
    C --> D

    E[FontAwesome NPM] --> B
    F[Flask DevServer] --> C

Production Deployment

graph TB
    subgraph "Replit Environment"
        A[Git Repository]
        B[Nix Package Manager]
        C[Flask WSGI Server]
        D[Static File Serving]
    end

    subgraph "External"
        E[CDN/Browser Cache]
        F[FontAwesome Registry]
    end

    A --> C
    B --> C
    C --> D
    D --> E
    F --> B

Evidenz: pyproject.toml:1-8, replit environment

Architektonische Entscheidungen

1. Separierte Runtimes (Node.js + Python)

Entscheidung: Zwei separate Runtimes statt einer einheitlichen
Begründung: - Node.js: Optimal für FontAwesome-Integration (native NPM-Packages) - Python/Flask: Bewährte Lösung für Web-APIs und File-Serving - Separation of Concerns: Build-time (Node.js) vs. Runtime (Python)

Alternativen erwogen: - Pure Node.js mit Express → Komplexere File-Serving-Logik - Pure Python → FontAwesome-Integration über separate Tools

Evidenz: package.json:1-17, pyproject.toml:1-8

2. File-System als Primärer Storage

Entscheidung: SVG-Dateien im Dateisystem statt Database
Begründung: - Performance: Direktes Serving durch Webserver möglich - Einfachheit: Keine Database-Dependencies - Developer Experience: Icons können direkt inspiziert werden - Portabilität: Einfache ZIP-Verteilung

Trade-offs: - Metadata in separater JSON-Datei erforderlich - Keine komplexen Queries möglich

Evidenz: app.py:15-43, static/icons/ directory

3. Category-first Organization

Entscheidung: Kategorie-basierte Icon-Organisation statt Tag-System
Begründung: - User Experience: Einfache Navigation im Web-Interface - Maintenance: Klare Verantwortlichkeiten pro Kategorie - Performance: Efficient filtering ohne Database

Trade-offs: - Icons können nur einer Kategorie zugeordnet werden - Cross-cutting concerns schwieriger abbildbar

Evidenz: icons.json:1-206, app.py:22-43

4. SVG mit currentColor

Entscheidung: SVG fill="currentColor" statt feste Farben
Begründung: - CSS-Integration: Icons übernehmen Parent-Farbe - Theme-Kompatibilität: Dark/Light Mode automatisch - Bundle-Effizienz: Keine color-spezifischen Varianten nötig

Evidenz: extract-icons.js:88-94

Quality Attributes

Performance

  • Icon Extraction: <3s für komplette Bibliothek
  • Web Response: <100ms für Icon-Liste
  • Bundle Size: <70KB für alle Icons

Scalability

  • Icons: Unterstützt 500+ Icons ohne Performance-Degradation
  • Categories: Bis zu 50 Kategorien praktikabel
  • Concurrent Users: 20+ mit Standard-Flask-Deployment

Maintainability

  • Code Separation: Clear boundaries zwischen Extraction und Serving
  • Configuration: Centralized in extract-icons.js und icons.json
  • Documentation: Evidence-based docs mit Quellenangaben

Security

  • No User Input: Statische Datei-Generierung eliminiert Injection-Risiken
  • CORS-Ready: API kann Cross-Origin-Requests unterstützen
  • No Secrets: Keine sensiblen Daten im Repository

Evidenz: Gesamte Projektstruktur und -implementation

Zukünftige Architekturgrenzen

Scaling Bottlenecks

  1. File System Limits: >1000 Icons könnten Directory-Performance beeinträchtigen
  2. Single Process: Flask-App nicht horizontal skalierbar ohne Session-Store
  3. Memory Usage: Komplette Icon-Liste wird in Memory gehalten

Evolution Paths

  1. Database Migration: PostgreSQL für Metadata bei >500 Icons
  2. Microservices: Separate Services für Extraction, Serving, Management
  3. CDN Integration: Cloud Storage für Icon-Distribution

Related Documents: - ADR-0001: Technology Stack - Nonfunctional Requirements - Backend Overview