# 🗂️ Projekt-Dashboard Ein selbst gehostetes Dashboard zur zentralen Verwaltung aller persönlichen Projekte – technische wie nicht-technische. --- ## 💡 Was ist ein Projekt? Ein Projekt ist **alles, woran aktiv gearbeitet wird oder wurde** – unabhängig davon, ob es einen Code-Repository hat oder nicht. Beispiele: - 🖥️ **Softwareprojekt** – eine selbst gehostete App, ein CLI-Tool, ein Backend-Service - 🔧 **Hardware-Projekt** – Aufbau eines zweiten PCs, Einrichten eines Homelab-Servers - 🏗️ **Infrastruktur** – Umstrukturierung des Heimnetzwerks, Migration zu Docker Compose - 📋 **Organisatorisches** – Dokumentation aufräumen, Backupstrategie planen - 🌱 **Persönliches** – Lernprojekte, Kurse, Ziele ohne technischen Bezug Ein Projekt **kann** mit einer Gitea-Repository verknüpft sein, **muss es aber nicht**. --- ## 🏷️ Repo-Verknüpfung (optional) Wenn ein Projekt eine zugehörige Gitea-Repository hat, kann diese durch das Topic-Tag `projekt` markiert werden. Das Dashboard erkennt diese Repos automatisch und zeigt zugehörige Metadaten an (letzter Commit, offene Issues, Sprache etc.). Repos **ohne** das Tag `projekt` erscheinen nicht im Dashboard – sie sind keine verwalteten Projekte. Projekte **ohne** Repository existieren nur in der Datenbank des Dashboards und werden manuell angelegt. --- ## 🧱 Architektur ``` ┌─────────────────────┐ Gitea REST API v1 ┌──────────────────────┐ │ Gitea Server │ ◄─────────────────────────────► │ Backend Service │ │ (Repos + Topics) │ (nur wenn Repo verknüpft) │ (Go, net/http) │ └─────────────────────┘ └──────────┬───────────┘ │ ┌──────────▼───────────┐ │ PostgreSQL DB │ │ (Projekte, Tasks, │ │ Milestones, Notizen) │ └──────────┬───────────┘ │ ┌──────────▼───────────┐ │ Frontend │ │ (SvelteKit) │ └──────────────────────┘ ``` --- ## 🖥️ Frontend: SvelteKit Warum SvelteKit? - Leichtgewichtig und schnell – ideal für ein internes Dashboard - Server-Side Rendering (SSR) out of the box – kein Flackern beim Laden - Einfache Reaktivität ohne Overhead - Perfekt für datengetriebene Übersichten mit Echtzeit-Updates Features im Frontend: - Projektkarten mit Name, Beschreibung, Status und offenen Tasks - Unterscheidung zwischen repo-gebundenen und freien Projekten - Filterfunktion nach Kategorie, Status, Aktivität - Detailansicht: Tasks, Milestones, Notizen pro Projekt - Live-Updates via Server-Sent Events (bei repo-gebundenen Projekten) - Dark Mode, responsive Design --- ## ⚙️ Backend: Go (net/http + pgx) Go eignet sich hervorragend als Backend-Sprache – die Standardbibliothek ist so vollständig, dass kein Web-Framework nötig ist. `net/http` liefert alles was gebraucht wird: Routing, Handler, Middleware. **Warum kein Framework?** - `net/http` aus der Standardbibliothek reicht für die benötigten Endpoints vollständig aus - Kein Framework-Overhead, keine Breaking Changes durch externe Dependencies - Go-typischer Ansatz: explizit, simpel, lesbar - Kompiliert zu einer einzigen statischen Binary – minimaler Docker-Footprint **Externe Dependencies (minimal):** - `pgx` – PostgreSQL-Treiber (direktes SQL, kein ORM) - `godotenv` – `.env`-Datei laden - `golang.org/x/oauth2` – OAuth2-Flow für Gitea-Login (optional) **Backend-Aufgaben:** - `GET /api/projects` – alle Projekte aus der DB zurückgeben - `POST /api/projects` – neues Projekt anlegen (mit oder ohne Repo-Verknüpfung) - `GET /api/projects/{id}/tasks` – Tasks eines Projekts abrufen - `POST /api/webhook` – Gitea Webhook-Listener für repo-gebundene Projekte - Hintergrund-Goroutine: Gitea API nach Repos mit Tag `projekt` abfragen und DB synchronisieren --- ## 🔐 Auth: Gitea OAuth2 Gitea fungiert als OAuth2-Provider – Nutzer loggen sich mit ihrem Gitea-Account im Dashboard ein. **Flow:** Nutzer klickt "Login mit Gitea" → Weiterleitung zur Gitea-Instanz → Nutzer bestätigt Zugriff → Gitea leitet mit Authorization Code zurück → Backend tauscht Code gegen Access Token → Nutzer ist eingeloggt **Vorteile:** - Kein eigenes Auth-System nötig - Nutzeridentität direkt bekannt - Implementiert mit `golang.org/x/oauth2` --- ## 🗄️ Datenbank: PostgreSQL **Schema-Übersicht:** ```sql -- Alle Projekte (mit oder ohne Repo-Verknüpfung) CREATE TABLE projects ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, description TEXT, status VARCHAR(50) DEFAULT 'active', -- active / paused / done category VARCHAR(100), -- z.B. "software", "hardware", "infra", "personal" gitea_repo TEXT, -- optional: voller Repo-Name (z.B. "Jannis/mein-projekt") gitea_id INTEGER, -- optional: Gitea-interne Repo-ID html_url TEXT, -- optional: Link zur Repo language VARCHAR(100), -- optional: Hauptsprache der Repo open_tasks INTEGER DEFAULT 0, last_activity TIMESTAMPTZ, created_at TIMESTAMPTZ DEFAULT NOW(), synced_at TIMESTAMPTZ -- NULL wenn kein Gitea-Sync ); -- Tasks / Aufgaben pro Projekt CREATE TABLE tasks ( id SERIAL PRIMARY KEY, project_id INTEGER REFERENCES projects(id), gitea_issue_id INTEGER, -- optional: verknüpftes Gitea-Issue title TEXT NOT NULL, body TEXT, state VARCHAR(20) DEFAULT 'open', -- open / closed priority VARCHAR(20), -- low / medium / high milestone TEXT, assignee VARCHAR(100), updated_at TIMESTAMPTZ DEFAULT NOW() ); -- Milestones pro Projekt CREATE TABLE milestones ( id SERIAL PRIMARY KEY, project_id INTEGER REFERENCES projects(id), title TEXT NOT NULL, description TEXT, due_date TIMESTAMPTZ, closed BOOLEAN DEFAULT false ); -- Webhook-Event-Log (nur für repo-gebundene Projekte) CREATE TABLE webhook_events ( id SERIAL PRIMARY KEY, event_type VARCHAR(50), project_id INTEGER REFERENCES projects(id), payload JSONB, received_at TIMESTAMPTZ DEFAULT NOW() ); ``` --- ## 🚀 Roadmap - **v0.1** – Projekt-Listing: manuelle Projekte anlegen, Repos mit Tag `projekt` automatisch einlesen - **v0.2** – Webhook-Listener für Echtzeit-Sync bei repo-gebundenen Projekten - **v0.3** – Tasks & Milestones im Dashboard anzeigen und verwalten - **v0.4** – Tasks direkt aus dem Dashboard erstellen/schließen (bi-direktional mit Gitea) - **v0.5** – Gitea OAuth2 Login - **v0.6** – Kategorien, Filter, Status-Verwaltung für alle Projekttypen - **v1.0** – Multi-User, öffentliche Projektseiten --- ## 🔧 Tech Stack | Schicht | Technologie | |-------------|-------------------------------------| | Frontend | SvelteKit + TailwindCSS | | Backend | Go + net/http (Standardlib) | | Datenbank | PostgreSQL + pgx | | Auth | Gitea OAuth2 + golang.org/x/oauth2 | | API | Gitea REST API v1 (optional) | | Deployment | Docker Compose | --- ## 📦 Getting Started ```bash # Repo klonen git clone https://gitea.starfour.de/Jannis/gitea-projekt-dashboard # Umgebungsvariablen setzen cp .env.example .env # GITEA_URL, GITEA_TOKEN, DATABASE_URL, PROJEKT_TAG eintragen # Mit Docker starten docker compose up -d ``` --- Dieses Projekt ist Teil der persönlichen Projekt-Ideen-Sammlung. Zugehöriges Übersichts-Repo: [projekt-ideen](https://gitea.starfour.de/Jannis/projekt-ideen)