diff --git a/README.md b/README.md index d34c8a1..ac10b04 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,17 @@
+Oikos Dashboard + +

+ # Oikos -### Der Familienplaner, der bei dir zuhause bleibt. +**Dein Familienplaner. Dein Server. Deine Daten.** -Oikos ist eine selbstgehostete Web-App, die den Alltag deiner Familie organisiert — -vom Einkaufszettel bis zum Kalender, vom Essensplan bis zum Budget. -Alles auf deinem eigenen Server. Ohne Cloud. Ohne Abo. Ohne Tracking. +Eine selbstgehostete Web-App, die den Alltag deiner Familie organisiert —
+vom Einkaufszettel bis zum Kalender, vom Essensplan bis zum Budget.
+Ohne Cloud. Ohne Abo. Ohne Tracking.
@@ -16,89 +20,110 @@ Alles auf deinem eigenen Server. Ohne Cloud. Ohne Abo. Ohne Tracking. [![Docker](https://img.shields.io/badge/Docker-ready-2496ED?style=flat-square&logo=docker&logoColor=white)](https://www.docker.com) [![SQLite](https://img.shields.io/badge/SQLite-verschl%C3%BCsselt-003B57?style=flat-square&logo=sqlite&logoColor=white)](https://www.zetetic.net/sqlcipher/) [![PWA](https://img.shields.io/badge/PWA-offline--f%C3%A4hig-5A0FC8?style=flat-square)](https://web.dev/progressive-web-apps/) +[![WCAG](https://img.shields.io/badge/WCAG_2.2-AA-228B22?style=flat-square)](https://www.w3.org/WAI/WCAG22/quickref/) [![Lizenz](https://img.shields.io/badge/Lizenz-MIT-green?style=flat-square)](./LICENSE)
-[Funktionen](#-was-kann-oikos) · [Screenshots](#-screenshots) · [Installation](#-installation) · [Konfiguration](#-konfiguration) · [FAQ](#-faq) - -
+[Warum Oikos?](#-warum-open-source--privacy) · [Funktionen](#-module) · [Screenshots](#-screenshots) · [Installation](#-schnellstart) · [FAQ](#-faq) ---- - -
- -## Warum Oikos? - -Die meisten Familienplaner sind Cloud-Dienste: Deine Termine, Einkaufslisten und Finanzdaten liegen auf fremden Servern. Oikos dreht das um. - -| | Cloud-Dienste | Oikos | -|:---|:---|:---| -| **Deine Daten** | Auf fremden Servern | Auf deinem Server, verschlüsselt | -| **Kosten** | Monatliches Abo | Einmal einrichten, dauerhaft kostenlos | -| **Datenschutz** | Tracking, Werbung, Analyse | Kein Tracking. Keine Telemetrie. Nichts. | -| **Verfügbarkeit** | Abhängig vom Anbieter | Du hast die Kontrolle | -| **Zugang** | App Store nötig | Browser reicht (PWA, installierbar) | - -> **Der Name:** *Oikos* (griechisch: *oikos*) bedeutet „Haus" oder „Haushalt" — der Ursprung des Wortes *Ökonomie*. Passend für eine App, die deinen Haushalt organisiert. -
---
-## Was kann Oikos? +## Warum Open Source & Privacy? + +Termine, Einkaufslisten, Finanzen, Kontakte von Kinderärzten, Schulzeiten, Medikamentenpläne — ein Familienplaner speichert **die intimsten Details eines Haushalts**. Wer wann wo ist. Was eingekauft wird. Wie viel Geld wofür ausgegeben wird. Namen und Daten der Kinder. + +Die meisten Familienplaner sind Cloud-Dienste. Deine Daten liegen auf fremden Servern, werden analysiert, monetarisiert, oder sind einem Datenleck ausgesetzt. Du hast keine Kontrolle — und oft nicht einmal Einblick, was mit den Informationen deiner Familie passiert. + +**Das muss nicht so sein.** + +> *Oikos* (griech. *oíkos*) bedeutet „Haus" oder „Haushalt" — der Ursprung des Wortes *Ökonomie*.
Eine App, die deinen Haushalt organisiert, sollte auch dort bleiben: **bei dir zuhause.** + +
+ +### Das Problem mit der Cloud - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + +
-
Modul
-
Beschreibung
DashboardDein Tagesstart auf einen Blick: Wetter, anstehende Termine, dringende Aufgaben, heutiges Essen und angepinnte Notizen. Alles in einem personalisierten Feed.
AufgabenAufgaben erstellen, priorisieren und Familienmitgliedern zuweisen. Mit Teilaufgaben, Wiederholungen (täglich/wöchentlich/monatlich), Statusfiltern und Swipe-Gesten auf dem Handy.
EinkaufMehrere Einkaufslisten parallel führen (REWE, dm, Baumarkt ...). Artikel werden automatisch nach Supermarkt-Kategorien gruppiert — wie ein digitaler Einkaufszettel, den die ganze Familie gemeinsam befüllt.
EssensplanWochenplan für Frühstück, Mittag, Abend und Snacks. Zutaten pro Mahlzeit erfassen und mit einem Klick auf die Einkaufsliste übernehmen.
KalenderFamilienkalender mit vier Ansichten (Monat, Woche, Tag, Agenda). Farbcodiert pro Person. Wiederkehrende Termine. Optional mit Google Calendar und Apple iCloud synchronisierbar.
PinnwandFarbige Sticky Notes im Masonry-Grid. Für schnelle Erinnerungen, Nachrichten an die Familie oder Ideen. Mit Markdown-Light (fett, kursiv, Listen).
KontakteWichtige Kontakte der Familie — Kinderarzt, Schule, Handwerker, Versicherung. Mit Direktanruf per Tap, E-Mail-Links und Kartennavigation.
BudgetEinnahmen und Ausgaben tracken, nach Kategorien auswerten, Monate vergleichen. Mit wiederkehrenden Buchungen (Miete, Gehalt) und CSV-Export.
EinstellungenDark Mode (System / Hell / Dunkel), Passwort ändern, Kalender-Sync verwalten, Familienmitglieder anlegen.
+ +**Cloud-Familienplaner** + +- Daten liegen auf fremden Servern +- Geschäftsmodell basiert auf deinen Daten +- Dienst wird eingestellt? Daten weg. +- Abo-Kosten, oft pro Familienmitglied +- Tracking, Analyse, Werbeprofiling +- Datenschutz der Kinder abhängig vom Anbieter + + + +**Oikos (selbstgehostet)** + +- Daten bleiben auf deinem Server +- Kein Tracking. Keine Telemetrie. **Nichts.** +- Du hast die volle Kontrolle — dauerhaft +- Einmal einrichten, kostenlos nutzen +- Kein Byte verlässt dein Netzwerk +- DSGVO? Kein Thema — du bist der Betreiber + +

+### Warum das für Familien besonders wichtig ist + +Ein Familienplaner aggregiert Daten, die einzeln harmlos wirken, zusammen aber ein **vollständiges Profil** ergeben: + +- **Tagesabläufe** — Wann sind die Kinder in der Schule? Wann ist niemand zuhause? +- **Gesundheitsdaten** — Arzttermine, Allergien in Essensplänen, Medikamenten-Erinnerungen +- **Finanzverhalten** — Einkommen, Ausgaben, finanzielle Engpässe +- **Einkaufsgewohnheiten** — Was wird gekauft, wie oft, in welchen Mengen? +- **Soziales Netz** — Kontakte zu Schulen, Ärzten, Betreuern — mit Adressen und Telefonnummern + +Bei kommerziellen Cloud-Diensten fließen diese Daten durch Drittanbieter-Infrastruktur, unterliegen deren AGBs und sind potenziell Gegenstand von Data Breaches. + +**Open Source bedeutet:** Der Code ist einsehbar. Niemand kann versteckte Tracker einbauen. Du kannst jede Zeile prüfen — oder jemanden bitten, es für dich zu tun. Und wenn du Oikos nicht mehr brauchst, löschst du den Container. Ende. + +
+ +--- + +
+ +## Module + +Oikos ist modular aufgebaut — jedes Modul löst ein konkretes Problem im Familienalltag: + +
+ +> **Dashboard**  ·  Dein Tagesstart auf einen Blick: Wetter, Termine, dringende Aufgaben, heutiges Essen und angepinnte Notizen. + +> **Aufgaben**  ·  Erstellen, priorisieren, zuweisen. Mit Teilaufgaben, Wiederholungen, Statusfiltern und Swipe-Gesten auf dem Handy. + +> **Einkauf**  ·  Mehrere Listen parallel (REWE, dm, Baumarkt). Automatische Gruppierung nach Kategorien. Die ganze Familie befüllt gemeinsam. + +> **Essensplan**  ·  Wochenplan für alle Mahlzeiten. Zutaten erfassen und mit einem Klick auf die Einkaufsliste übernehmen. + +> **Kalender**  ·  Vier Ansichten (Monat, Woche, Tag, Agenda), farbcodiert pro Person. Optional mit Google Calendar und Apple iCloud synchronisierbar. + +> **Pinnwand**  ·  Farbige Sticky Notes für Erinnerungen, Nachrichten an die Familie oder Ideen. Mit Markdown-Light. + +> **Kontakte**  ·  Kinderarzt, Schule, Handwerker, Versicherung — mit Direktanruf, E-Mail und Kartennavigation. + +> **Budget**  ·  Einnahmen und Ausgaben tracken, nach Kategorien auswerten, Monate vergleichen. Mit wiederkehrenden Buchungen und CSV-Export. + +
+ ---
@@ -112,29 +137,29 @@ Die meisten Familienplaner sind Cloud-Dienste: Deine Termine, Einkaufslisten und @@ -151,25 +176,25 @@ Die meisten Familienplaner sind Cloud-Dienste: Deine Termine, Einkaufslisten und
- Dashboard
+ Dashboard
Dashboard
Wetter, Termine, Aufgaben, Essen
- Aufgaben
+ Aufgaben
Aufgaben
Prioritäten, Zuweisung, Filter
- Kalender
+ Kalender
Kalender
Monatsansicht, Tagesdetails
- Einkaufsliste
+ Einkaufsliste
Einkauf
Mehrere Listen, Kategorien
- Essensplan
+ Essensplan
Essensplan
Wochenplan, Zutaten
- Dashboard Dark
+ Dashboard Dark
Dashboard
- Aufgaben Dark
+ Aufgaben Dark
Aufgaben
- Kalender Dark
+ Kalender Dark
Kalender
- Einkaufsliste Dark
+ Einkaufsliste Dark
Einkauf
- Essensplan Dark
+ Essensplan Dark
Essensplan
@@ -178,7 +203,7 @@ Die meisten Familienplaner sind Cloud-Dienste: Deine Termine, Einkaufslisten und
-Dark Mode folgt automatisch deiner Systemeinstellung oder lässt sich manuell unter Einstellungen umschalten. +Dark Mode folgt automatisch deiner Systemeinstellung oder lässt sich manuell umschalten. @@ -188,224 +213,93 @@ Die meisten Familienplaner sind Cloud-Dienste: Deine Termine, Einkaufslisten und
-## Technik auf einen Blick +## Technik Oikos setzt bewusst auf einen minimalen, wartungsarmen Stack — keine 200 npm-Pakete, kein Build-Step, kein Framework-Lock-in. | Schicht | Technologie | |:---|:---| | **Server** | Node.js + Express.js | -| **Datenbank** | SQLite mit SQLCipher-Verschlüsselung (AES-256) | -| **Frontend** | Vanilla JavaScript (ES-Module), eigenes CSS — kein React, kein Vue, kein Bundler | -| **Auth** | Session-basiert, bcrypt-Passwort-Hashing, CSRF-Schutz | +| **Datenbank** | SQLite + SQLCipher (AES-256-Verschlüsselung at rest) | +| **Frontend** | Vanilla JS (ES-Module), eigenes CSS — kein React, kein Vue, kein Bundler | +| **Auth** | Session-basiert, bcrypt (Cost 12), CSRF-Schutz, Rate Limiting | | **Deployment** | Docker (ein Container, ein Volume) | -| **PWA** | Service Worker + Manifest — installierbar auf Homescreen, offline-fähig | +| **PWA** | Service Worker + Manifest — installierbar, offline-fähig | +| **Accessibility** | WCAG 2.2 AA — Skip-Links, Touch-Targets, Reduced Motion, aria-Labels | | **Kalender-Sync** | Google Calendar API v3 (OAuth) + Apple iCloud CalDAV (optional) | -
- ---- - -
- -## Installation - -> **Zeitaufwand:** ca. 10–15 Minuten, auch wenn du Docker zum ersten Mal nutzt. - -### Voraussetzungen - -Du brauchst einen Linux-Server (oder eine lokale Linux-Maschine / VM / Raspberry Pi) mit: - -- **Docker** und **Docker Compose** — [Installationsanleitung (offizielle Docs)](https://docs.docker.com/engine/install/) -- **Git** — ist auf den meisten Linux-Distributionen vorinstalliert (`git --version` zum Prüfen) - -> **Noch keinen Server?** Ein günstiger VPS (z.B. bei Hetzner, Netcup oder Oracle Cloud Free Tier) reicht völlig aus. Oikos braucht minimal 512 MB RAM und 1 CPU-Kern. - ---- - -### Schritt 1 — Repository herunterladen - -Öffne ein Terminal auf deinem Server und führe aus: - -```bash -git clone https://github.com/ulsklyc/oikos.git -cd oikos -``` -
-Was passiert hier? +Sicherheitsmaßnahmen im Detail -`git clone` lädt den gesamten Quellcode von GitHub auf deinen Server herunter. -`cd oikos` wechselt in das heruntergeladene Verzeichnis. +
+ +| Maßnahme | Details | +|:---|:---| +| **Verschlüsselte Datenbank** | SQLCipher (AES-256) — Daten sind auch bei physischem Serverzugriff geschützt | +| **Passwort-Hashing** | bcrypt mit Cost Factor 12 — kein Klartext, nie | +| **Session-Schutz** | `httpOnly`, `SameSite=Strict`, `Secure`-Cookies, 7 Tage Ablauf | +| **CSRF-Schutz** | Double Submit Cookie mit `crypto.timingSafeEqual` | +| **Rate Limiting** | 5 Login-Versuche pro Minute, dann 15 Min. Sperre | +| **Input-Validation** | Zentrale Validierung auf allen Endpoints (Länge, Typ, Whitelist) | +| **SQL-Injection-Schutz** | Parametrisierte Queries — kein String-Zusammenbau | +| **Security Headers** | CSP, HSTS, X-Frame-Options via Helmet | +| **Kein offener Zugang** | Jeder API-Endpoint erfordert Authentifizierung (außer Login) | +| **Keine Telemetrie** | Kein externer Request, kein Analytics, kein Font-Loading |
+
+ --- -### Schritt 2 — Konfiguration anlegen +
+ +## Schnellstart + +> **Voraussetzungen:** Ein Linux-System mit [Docker](https://docs.docker.com/engine/install/) + Docker Compose und Git. +>
Ein günstiger VPS (Hetzner, Netcup) oder ein Raspberry Pi 4 reichen aus — Oikos braucht minimal 512 MB RAM. + +
+ +**1. Repository klonen** + +```bash +git clone https://github.com/ulsklyc/oikos.git && cd oikos +``` + +**2. Konfiguration anlegen** ```bash cp .env.example .env -``` - -Jetzt die `.env`-Datei bearbeiten — z.B. mit `nano`: - -```bash nano .env ``` -Mindestens diese zwei Felder musst du ausfüllen: +Mindestens diese zwei Werte setzen (jeweils mit `openssl rand -base64 32` generieren): ```env -# Ein langer, zufälliger String. Wird zum Signieren von Sessions verwendet. -# So generierst du einen im Terminal: -# openssl rand -base64 32 -SESSION_SECRET=hier_einen_langen_zufaelligen_string_eintragen - -# Verschlüsselungsschlüssel für die Datenbank (AES-256). -# Ebenfalls mit openssl generieren. Leer lassen = keine Verschlüsselung. -DB_ENCRYPTION_KEY=hier_einen_starken_schluessel_eintragen +SESSION_SECRET=dein_zufaelliger_string +DB_ENCRYPTION_KEY=dein_verschluesselungs_key ``` -
-Schlüssel generieren — so geht's - -Führe diesen Befehl zweimal aus und kopiere die Ausgabe jeweils in die `.env`: - -```bash -openssl rand -base64 32 -``` - -Das erzeugt eine zufällige Zeichenfolge wie `K7xQ3m+r9Fz1bY4p...` — perfekt als Secret. - -
- -
-Was bedeuten die anderen Felder in der .env? - -Die `.env.example` enthält noch weitere Optionen (Wetter, Kalender-Sync etc.). Diese sind alle **optional** und werden weiter unten im Abschnitt [Konfiguration](#-konfiguration) erklärt. Für den Start brauchst du nur die zwei Pflichtfelder. - -
- -Speichern in nano: `Strg+O`, `Enter`, `Strg+X`. - ---- - -### Schritt 3 — App starten +**3. Starten** ```bash docker compose up -d --build ``` -Der erste Build kompiliert SQLCipher und dauert **2–3 Minuten**. Alle weiteren Starts sind deutlich schneller. - -Prüfe, ob der Container läuft: +Der erste Build dauert 2–3 Minuten (SQLCipher-Kompilierung). Danach: ```bash -docker compose ps +docker compose exec oikos node setup.js # Ersten Admin-Account anlegen ``` -Du solltest sehen, dass der Container `oikos` den Status `Up` hat. Falls etwas nicht stimmt: - -```bash -docker compose logs oikos --tail=30 -``` - -Wenn in den Logs steht: - -``` -[Oikos] Server läuft auf Port 3000 -``` - -...ist alles bereit. - ---- - -### Schritt 4 — Ersten Benutzer anlegen - -```bash -docker compose exec oikos node setup.js -``` - -Das Script fragt dich interaktiv nach: -- **Benutzername** — zum Einloggen (z.B. `mama`, `papa`, `lisa`) -- **Anzeigename** — wird in der App angezeigt (z.B. `Lisa Müller`) -- **Passwort** — mindestens 6 Zeichen - -Dieser erste Account bekommt automatisch **Admin-Rechte** und kann später weitere Familienmitglieder anlegen. - ---- - -### Schritt 5 — App öffnen - -Im Browser aufrufen: +**4. Öffnen** ``` http://:3000 ``` -Logge dich mit dem gerade erstellten Account ein — fertig! - -> **Hinweis für lokalen Zugriff ohne HTTPS:** -> Im Produktionsmodus erwartet Oikos standardmäßig HTTPS für sichere Cookies. Wenn du die App zunächst ohne Reverse Proxy testen möchtest, füge in der `.env` hinzu: -> ```env -> SESSION_SECURE=false -> ``` -> Dann Container neu starten: `docker compose down && docker compose up -d` -> -> **Entferne diese Zeile wieder**, sobald du HTTPS eingerichtet hast (siehe nächster Schritt). - ---- - -### Schritt 6 — HTTPS einrichten (empfohlen) - -Für den dauerhaften Betrieb sollte Oikos hinter einem Reverse Proxy mit SSL laufen. Das schützt Passwörter und Sessions auf dem Transportweg. - -
-Variante A: Nginx Proxy Manager (empfohlen für Einsteiger) - -[Nginx Proxy Manager](https://nginxproxymanager.com) ist ein benutzerfreundlicher Reverse Proxy mit Web-Oberfläche. - -1. **Nginx Proxy Manager installieren** (falls noch nicht vorhanden) — [Anleitung](https://nginxproxymanager.com/guide/) -2. Neuen **Proxy Host** anlegen: - - Domain: `oikos.deine-domain.de` - - Forward Hostname: `deine-server-ip` (oder `localhost` wenn auf demselben Server) - - Forward Port: `3000` -3. Reiter **SSL**: Let's Encrypt Zertifikat ausstellen lassen (kostenlos, automatisch) -4. Reiter **Advanced**: Den Inhalt von [`nginx.conf.example`](./nginx.conf.example) einfügen - -**Wichtig:** Der Header `X-Forwarded-Proto` muss gesetzt sein (ist in der Beispielkonfiguration enthalten). Ohne ihn erkennt Oikos nicht, dass die Verbindung per HTTPS läuft. - -
- -
-Variante B: Nginx manuell konfigurieren - -Kopiere die Datei [`nginx.conf.example`](./nginx.conf.example) und passe die Domain an: - -```bash -sudo cp nginx.conf.example /etc/nginx/sites-available/oikos -sudo ln -s /etc/nginx/sites-available/oikos /etc/nginx/sites-enabled/ -# Domain in der Datei anpassen: -sudo nano /etc/nginx/sites-available/oikos -``` - -Für SSL-Zertifikate mit Let's Encrypt: - -```bash -sudo apt install certbot python3-certbot-nginx -sudo certbot --nginx -d oikos.deine-domain.de -``` - -Nginx neu laden: - -```bash -sudo nginx -t && sudo systemctl reload nginx -``` - -
- -Sobald HTTPS läuft: `SESSION_SECURE=false` aus der `.env` **entfernen** und Container neu starten. +> Ohne HTTPS-Reverse-Proxy: `SESSION_SECURE=false` in der `.env` setzen. Für den Produktionsbetrieb empfehlen wir HTTPS — [Einrichtung siehe unten](#https-einrichten).
@@ -417,38 +311,62 @@ Sobald HTTPS läuft: `SESSION_SECURE=false` aus der `.env` **entfernen** und Con ### Pflichtfelder -| Variable | Beschreibung | Beispiel | +| Variable | Beschreibung | +|:---|:---| +| `SESSION_SECRET` | Zufälliger String (mind. 32 Zeichen) — `openssl rand -base64 32` | +| `DB_ENCRYPTION_KEY` | SQLCipher-Schlüssel (AES-256) — leer = keine Verschlüsselung | + +### Optionale Features + +| Variable | Standard | Beschreibung | |:---|:---|:---| -| `SESSION_SECRET` | Zufälliger String (mind. 32 Zeichen) zum Signieren von Sessions | `openssl rand -base64 32` | -| `DB_ENCRYPTION_KEY` | SQLCipher-Schlüssel (AES-256) — leer = keine Verschlüsselung | `openssl rand -base64 32` | +| `OPENWEATHER_API_KEY` | — | API-Key für Wetter-Widget ([openweathermap.org](https://openweathermap.org/api), kostenlos) | +| `OPENWEATHER_CITY` | — | Stadt für Wettervorhersage (z.B. `Berlin`) | +| `SESSION_SECURE` | `true` | Auf `false` setzen wenn kein HTTPS (nur zum Testen) | +| `PORT` | `3000` | Server-Port im Container | +| `SYNC_INTERVAL_MINUTES` | `15` | Kalender-Sync-Intervall | -### Wetter-Widget +Alle Optionen mit Erklärungen: [`.env.example`](./.env.example) -Das Dashboard zeigt ein Wetter-Widget, wenn ein API-Key konfiguriert ist. Kostenlos registrieren bei [openweathermap.org](https://openweathermap.org/api): +
-```env -OPENWEATHER_API_KEY=dein_api_key_hier -OPENWEATHER_CITY=Berlin -OPENWEATHER_UNITS=metric # metric = Celsius, imperial = Fahrenheit -OPENWEATHER_LANG=de +--- + +
+ +## HTTPS einrichten + +Für den dauerhaften Betrieb sollte Oikos hinter einem Reverse Proxy mit SSL laufen. + +
+Nginx Proxy Manager (empfohlen für Einsteiger) + +
+ +1. [Nginx Proxy Manager installieren](https://nginxproxymanager.com/guide/) +2. Neuen Proxy Host anlegen: Domain → `oikos.deine-domain.de`, Port → `3000` +3. SSL-Tab: Let's Encrypt Zertifikat ausstellen (kostenlos, automatisch) +4. Advanced-Tab: Inhalt von [`nginx.conf.example`](./nginx.conf.example) einfügen + +
+ +
+Nginx manuell + +
+ +```bash +sudo cp nginx.conf.example /etc/nginx/sites-available/oikos +sudo ln -s /etc/nginx/sites-available/oikos /etc/nginx/sites-enabled/ +sudo nano /etc/nginx/sites-available/oikos # Domain anpassen +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d oikos.deine-domain.de +sudo nginx -t && sudo systemctl reload nginx ``` -### Sicherheit +
-| Variable | Standard | Beschreibung | -|:---|:---|:---| -| `SESSION_SECURE` | *(nicht gesetzt)* | Auf `false` setzen wenn kein HTTPS verfügbar (nur zum Testen!) | -| `RATE_LIMIT_MAX_ATTEMPTS` | `5` | Max. fehlgeschlagene Login-Versuche pro Minute | - -### Weitere Optionen - -| Variable | Standard | Beschreibung | -|:---|:---|:---| -| `PORT` | `3000` | Server-Port im Container | -| `DB_PATH` | `/data/oikos.db` | Datenbankpfad im Container | -| `SYNC_INTERVAL_MINUTES` | `15` | Kalender-Sync-Intervall (in Minuten) | - -Die vollständige Vorlage mit allen Optionen findest du in [`.env.example`](./.env.example). +Danach `SESSION_SECURE=false` aus der `.env` entfernen und Container neu starten.
@@ -458,80 +376,41 @@ Die vollständige Vorlage mit allen Optionen findest du in [`.env.example`](./.e ## Kalender-Synchronisation -Oikos kann sich mit externen Kalendern synchronisieren, damit Termine aus Google Calendar oder Apple iCloud automatisch in der App erscheinen — und umgekehrt. - -### Google Calendar -
-Schritt-für-Schritt-Anleitung +Google Calendar -#### 1. Google Cloud Projekt anlegen +
-1. Gehe zu [console.cloud.google.com](https://console.cloud.google.com) und erstelle ein neues Projekt -2. Aktiviere die **Google Calendar API** unter „APIs & Dienste" → „Bibliothek" -3. Unter „APIs & Dienste" → „Anmeldedaten" → **OAuth 2.0-Client-ID erstellen** - - Anwendungstyp: „Webanwendung" - - Autorisierte Redirect-URI: - ``` - https://oikos.deine-domain.de/api/v1/calendar/google/callback - ``` -4. Client-ID und Client-Secret kopieren +1. [Google Cloud Console](https://console.cloud.google.com) → Neues Projekt → Google Calendar API aktivieren +2. OAuth 2.0-Client-ID erstellen (Webanwendung), Redirect-URI: + ``` + https://oikos.deine-domain.de/api/v1/calendar/google/callback + ``` +3. In `.env` eintragen: + ```env + GOOGLE_CLIENT_ID=deine-client-id.apps.googleusercontent.com + GOOGLE_CLIENT_SECRET=dein-client-secret + GOOGLE_REDIRECT_URI=https://oikos.deine-domain.de/api/v1/calendar/google/callback + ``` +4. In Oikos: Einstellungen → Kalender-Synchronisation → Mit Google verbinden -#### 2. In Oikos konfigurieren - -In der `.env` eintragen: - -```env -GOOGLE_CLIENT_ID=deine-client-id.apps.googleusercontent.com -GOOGLE_CLIENT_SECRET=dein-client-secret -GOOGLE_REDIRECT_URI=https://oikos.deine-domain.de/api/v1/calendar/google/callback -``` - -Container neu starten: `docker compose up -d` - -#### 3. Verbindung herstellen - -1. In Oikos einloggen (Admin-Account) -2. **Einstellungen** → **Kalender-Synchronisation** → **Mit Google verbinden** -3. Google-Konto auswählen und autorisieren -4. Automatische Weiterleitung zurück zu Oikos - -#### So funktioniert der Sync - -- **Erster Sync:** Termine der letzten 3 Monate und nächsten 12 Monate werden importiert -- **Folge-Syncs:** Nur Änderungen werden abgeglichen (effizient via Google syncToken) -- **Neue lokale Termine** werden auch nach Google übertragen (bidirektional) -- **Bei Konflikten** gewinnt Google — lokale Ergänzungen bleiben erhalten +**Sync-Verhalten:** Bidirektional. Erster Sync: 3 Monate zurück, 12 Monate voraus. Bei Konflikten gewinnt Google, lokale Ergänzungen bleiben erhalten.
-### Apple Calendar (iCloud) -
-Schritt-für-Schritt-Anleitung +Apple Calendar (iCloud) -#### 1. App-spezifisches Passwort erstellen +
-Apple erfordert ein eigenes Passwort für Drittanbieter-Apps: - -1. Gehe zu [appleid.apple.com](https://appleid.apple.com) -2. Unter „Anmeldung und Sicherheit" → „App-spezifische Passwörter" → „Passwort generieren" -3. Label eingeben (z.B. „Oikos") -4. Das generierte Passwort kopieren (Format: `xxxx-xxxx-xxxx-xxxx`) - -#### 2. In Oikos konfigurieren - -In der `.env` eintragen: - -```env -APPLE_CALDAV_URL=https://caldav.icloud.com -APPLE_USERNAME=deine@apple-id.de -APPLE_APP_SPECIFIC_PASSWORD=xxxx-xxxx-xxxx-xxxx -``` - -Container neu starten: `docker compose up -d` - -Der Sync-Button erscheint dann automatisch in den Einstellungen. +1. [appleid.apple.com](https://appleid.apple.com) → App-spezifisches Passwort generieren +2. In `.env` eintragen: + ```env + APPLE_CALDAV_URL=https://caldav.icloud.com + APPLE_USERNAME=deine@apple-id.de + APPLE_APP_SPECIFIC_PASSWORD=xxxx-xxxx-xxxx-xxxx + ``` +3. Container neu starten — Sync-Button erscheint in den Einstellungen
@@ -541,67 +420,36 @@ Der Sync-Button erscheint dann automatisch in den Einstellungen.
-## Familienmitglieder verwalten +## Wartung -Neue Accounts können **nur Admins** anlegen — es gibt absichtlich keine öffentliche Registrierung. - -**In der App:** Einstellungen → Familienmitglieder → Mitglied hinzufügen - -**Per Terminal** (z.B. für einen weiteren Admin): +### Updates ```bash -docker compose exec oikos node setup.js +cd oikos && git pull && docker compose up -d --build ``` -
+Datenbank-Migrationen laufen automatisch. Alle Daten im Volume bleiben erhalten. ---- - -
- -## Updates +### Backup & Restore ```bash -cd oikos -git pull -docker compose up -d --build -``` - -Das war's. Datenbank-Migrationen laufen automatisch beim Start. Alle Daten im Docker-Volume bleiben erhalten. - -> **Empfehlung:** Vor jedem Update ein Backup erstellen. - -
- ---- - -
- -## Datensicherung - -### Backup erstellen - -```bash -docker run --rm \ - -v oikos_oikos_data:/data \ - -v $(pwd):/backup \ +# Backup erstellen +docker run --rm -v oikos_oikos_data:/data -v $(pwd):/backup \ alpine tar czf /backup/oikos-backup-$(date +%Y%m%d).tar.gz /data -``` -Das erstellt eine komprimierte Sicherung der gesamten Datenbank im aktuellen Verzeichnis. - -### Backup wiederherstellen - -```bash +# Backup wiederherstellen docker compose down -docker run --rm \ - -v oikos_oikos_data:/data \ - -v $(pwd):/backup \ +docker run --rm -v oikos_oikos_data:/data -v $(pwd):/backup \ alpine tar xzf /backup/oikos-backup-YYYYMMDD.tar.gz -C / docker compose up -d ``` -> Ersetze `YYYYMMDD` durch das Datum deines Backups (z.B. `20260326`). +### Familienmitglieder verwalten + +Neue Accounts nur durch Admins — **keine öffentliche Registrierung** (by design). + +- **In der App:** Einstellungen → Familienmitglieder → Mitglied hinzufügen +- **Per Terminal:** `docker compose exec oikos node setup.js`
@@ -611,45 +459,14 @@ docker compose up -d ## Lokale Entwicklung -Falls du Oikos weiterentwickeln oder anpassen möchtest: - ```bash -git clone https://github.com/ulsklyc/oikos.git -cd oikos +git clone https://github.com/ulsklyc/oikos.git && cd oikos npm install -cp .env.example .env -# In der .env: SESSION_SECRET setzen, DB_ENCRYPTION_KEY leer lassen -npm run dev # Server starten mit Auto-Reload bei Dateiänderungen +cp .env.example .env # SESSION_SECRET setzen, DB_ENCRYPTION_KEY leer lassen +npm run dev # Auto-Reload bei Änderungen +npm test # 146 Tests, 7 Suiten (In-Memory-SQLite) ``` -Tests ausführen: - -```bash -npm test # 146 Tests, 7 Suiten (In-Memory-SQLite, kein laufender Server nötig) -``` - -
- ---- - -
- -## Sicherheit - -Oikos nimmt den Schutz deiner Familiendaten ernst: - -| Maßnahme | Details | -|:---|:---| -| **Verschlüsselte Datenbank** | SQLCipher (AES-256) — Daten sind auch bei Serverzugriff geschützt | -| **Sichere Passwörter** | bcrypt mit Cost Factor 12 — kein Klartext, nie | -| **Session-Schutz** | `httpOnly`, `SameSite=Strict`, `Secure`-Cookies, 7 Tage Ablauf | -| **CSRF-Schutz** | Double Submit Cookie mit `crypto.timingSafeEqual` | -| **Rate Limiting** | 5 Login-Versuche/Minute, dann 15 Min. Sperre | -| **Input-Validation** | Zentrale Validierung auf allen Endpoints (Länge, Typ, Whitelist) | -| **SQL-Injection-Schutz** | Parametrisierte Queries überall — kein String-Zusammenbau | -| **Security Headers** | CSP, HSTS, X-Frame-Options via Helmet | -| **Kein offener Zugang** | Jeder API-Endpoint erfordert Authentifizierung (außer Login) | -
--- @@ -659,52 +476,38 @@ Oikos nimmt den Schutz deiner Familiendaten ernst: ## FAQ
-Brauche ich Docker-Erfahrung? - -Nein. Die Installation besteht aus 6 Befehlen, die du einfach kopieren und einfügen kannst. Docker sorgt dafür, dass alles in einem isolierten Container läuft — du musst nichts manuell installieren oder konfigurieren. - +Brauche ich Docker-Erfahrung? +Nein. Die Installation besteht aus wenigen Befehlen, die du kopieren und einfügen kannst.
-Kann ich Oikos auf einem Raspberry Pi betreiben? - -Ja. Oikos läuft auf jedem System, das Docker unterstützt — einschließlich Raspberry Pi 4 (ARM64). Der Build dauert dort etwas länger (~5 Min), aber die App selbst läuft flüssig. - +Läuft Oikos auf einem Raspberry Pi? +Ja — Raspberry Pi 4 (ARM64) funktioniert problemlos. Der Build dauert dort ~5 Min, danach läuft die App flüssig.
-Ist Oikos auch auf dem Handy nutzbar? - -Ja, Oikos ist eine Progressive Web App (PWA). Du kannst sie im Browser nutzen oder auf deinen Homescreen installieren — sie verhält sich dann wie eine native App, inklusive Offline-Grundfunktionen. - +Ist Oikos auf dem Handy nutzbar? +Ja. Oikos ist eine PWA — installierbar auf dem Homescreen, mit Offline-Grundfunktionen. Keine App-Store-Abhängigkeit.
-Wie viele Familienmitglieder werden unterstützt? - -Oikos ist für 2–6 Personen konzipiert. Technisch gibt es kein festes Limit, aber das UI ist für kleine Familien und WGs optimiert. - +Wie viele Familienmitglieder werden unterstützt? +Konzipiert für 2–6 Personen. Kein technisches Limit, aber das UI ist für kleine Familien und WGs optimiert.
-Ist die Kalender-Synchronisation Pflicht? - -Nein. Der integrierte Kalender funktioniert komplett eigenständig. Google- und Apple-Sync sind optionale Zusatzfunktionen. - +Ist die Kalender-Synchronisation Pflicht? +Nein. Der integrierte Kalender funktioniert eigenständig. Google- und Apple-Sync sind optional.
-Was passiert mit meinen Daten bei einem Update? - -Deine Daten liegen in einem Docker-Volume und bleiben bei Updates erhalten. Datenbank-Migrationen laufen automatisch beim Start. Trotzdem empfehlen wir vor jedem Update ein Backup. - +Kann ich das Design anpassen? +Ja. Alle Farben, Abstände und Schriften sind als CSS Custom Properties in public/styles/tokens.css definiert — ohne Build-Step änderbar.
-Kann ich das Design anpassen? - -Ja. Oikos verwendet CSS Custom Properties (Design Tokens) für Farben, Abstände und Schriften. Diese kannst du in `public/styles/tokens.css` nach deinem Geschmack anpassen — ohne Build-Step. - +Was passiert bei einem Update mit meinen Daten? +Daten liegen in einem Docker-Volume und bleiben erhalten. Migrationen laufen automatisch. Vor Updates empfehlen wir ein Backup.

@@ -715,10 +518,12 @@ Ja. Oikos verwendet CSS Custom Properties (Design Tokens) für Farben, Abstände
-**Oikos** wird mit Sorgfalt entwickelt und ist Open Source. +**Oikos** ist Open Source und wird mit Sorgfalt entwickelt. -Feedback, Ideen und Beiträge sind willkommen — erstelle einfach ein [Issue](https://github.com/ulsklyc/oikos/issues). +Deine Familiendaten gehören dir — nicht einem Cloud-Anbieter. -[MIT-Lizenz](./LICENSE) · Made with care +
+ +Feedback, Ideen und Beiträge sind willkommen — [Issues](https://github.com/ulsklyc/oikos/issues) · [MIT-Lizenz](./LICENSE)