# combo-raport-app — Wiki

# combo-raport-app — Wiki

Interaktywna aplikacja raportowa do wizualizacji danych sprzedażowych i wolumenowych z systemu GoPos. Dane pobierane przez API, raporty wysyłane automatycznie emailem.

Interaktywna aplikacja raportowa do wizualizacji miesięcznych danych sprzedażowych i wolumenowych. Dane ładowane dynamicznie z plików JSON według wybranej listy i miesiąca.

---

## Spis treści

| Strona | Opis |
|--------|------|
| [Docker](Docker) | Uruchamianie kontenera, komendy, profile dev/prod |
| [Struktura projektu](Struktura-projektu) | Drzewo katalogów, stack technologiczny, skrypty |
| [Dane raportowe](Dane-raportowe) | Format JSON, listy, tabele, mapowanie ID komórek |
| [Komponenty](Komponenty) | Architektura UI, ThemeProvider, tabele, dark mode |
| [Backup](Backup) | Automatyczny backup danych na Google Drive, setup rclone, cron, disaster recovery |
| [Deploy](Deploy) | Deploy na produkcję (Mikrus), sync danych dev→prod, secrets, skrypt deploy-prod.sh |

---

## Szybki start

```bash
# Tryb developerski (hot-reload)
docker compose --profile dev up
# → http://localhost:5173

# Produkcja (nginx)
docker compose --profile prod up --build
# → http://localhost:4173
```

---

## Stack

| Warstwa | Technologia |
|---------|-------------|
| UI | React 19, Tailwind CSS 4, shadcn/ui, Base UI |
| Tabele | TanStack Table v8 |
| Build | Vite 7, TypeScript 5.9 |
| Kontener | Docker multi-stage, nginx 1.27-alpine |

---

## Schemat środowiska produkcyjnego

> **VPS home.pl** &middot; `212.132.103.157` &middot; Debian 13 trixie &middot; 4 vCPU / 7.7 GiB RAM / 237 GiB SSD  
> **Edytowalny diagram drawio:** plik `env-prod.drawio` w sekcji *Attachments* pod tą stroną — pobierz, otwórz na <https://app.diagrams.net> lub w VS Code (Draw.io Integration), zedytuj i wgraj z powrotem.

### Topologia (widok logiczny)

```
                                Internet (HTTPS)
                                       │
                                       ▼
                  ┌──────────────────────────────────────────┐
                  │  nginx (host) — ECDSA + certbot          │
                  │  arcane.t-pizza.pl  → 127.0.0.1:3552     │
                  │  combo.t-pizza.pl   → 127.0.0.1:4173     │
                  │  id.t-pizza.pl      → 127.0.0.1:9000     │
                  │  wiki.tepizza.pl    → 127.0.0.1:6875     │
                  └──────────────────────────────────────────┘
                                       │
          ╔════════════════════════════╪════════════════════════════╗
          ║       Docker network: web (external, bridge)            ║
          ║                                                          ║
          ║  ┌─────────────┐  ┌──────────────┐  ┌────────────────┐  ║
          ║  │  Arcane     │  │ combo_prod   │  │ Authentik      │  ║
          ║  │  v1.19.5    │  │ (React+nginx)│  │ server+worker  │  ║
          ║  │  :3552      │  │ :4173        │  │ +pg+redis :9000│  ║
          ║  └──────┬──────┘  └──────────────┘  └────────┬───────┘  ║
          ║         │   OIDC (issuer/token/userinfo)     │          ║
          ║         └─────────────────────────────────── ┘          ║
          ║                                                          ║
          ║  ┌─────────────────────┐    ┌────────────────────────┐  ║
          ║  │ BookStack + MariaDB │    │ Backup cron 03:30      │  ║
          ║  │ :6875               │    │ → Arcane Volume API    │  ║
          ║  │ wiki.tepizza.pl     │    │ → /opt/backups/arcane  │  ║
          ║  └─────────────────────┘    └────────────────────────┘  ║
          ╚══════════════════════════════════════════════════════════╝
```

### Stacki Docker

| Compose | Kontener | Port (host) | Domena | Notatki |
|---|---|---|---|---|
| `/opt/docker/arcane/compose.yaml` | `arcane` | `127.0.0.1:3552` | `arcane.t-pizza.pl` | Arcane v1.19.5 — OIDC w DB settings |
| `/root/combo-raport-app/docker-compose.yml` | `combo_prod` | `127.0.0.1:4173` | `combo.t-pizza.pl` | React 19 + nginx-alpine, volume `combo_data` |
| `/opt/docker/authentik/compose.yaml` | `authentik-{server,worker,postgresql,redis}` | `127.0.0.1:9000` | `id.t-pizza.pl` | Authentik 2026.2.3, SMTP via `serwer2104579.home.pl:587` |
| `/app/data/projects/bookstack/compose.yaml` *(Arcane-managed)* | `bookstack`, `bookstack-db` | `127.0.0.1:6875` | `wiki.tepizza.pl` | BookStack 26.3.5 + MariaDB 11, `client_max_body_size 50M` |

### SSO / OIDC

- **Provider:** Authentik (`id.t-pizza.pl`) — app `arcane` (pk=1) prod, `arcane-dev` (pk=3) lokalny
- **Relying party:** Arcane v1.19.5 — konfiguracja w DB (nie env), zmiany bez recreate kontenera
- **Redirect URI:** `https://arcane.t-pizza.pl/auth/oidc/callback` *(uwaga: frontend route, nie `/api/...`)*
- **Admin claim:** `groups` → grupa `arcane-admin` (członkowie: `akadmin`, `admin-combo`, `kamil.lendlewicz`, `matzxp84`)
- **Break-glass:** lokalny login Arcane pozostaje włączony (`authLocalEnabled=true`, `oidcAutoRedirectToProvider=false`)

### Backup

- **Skrypt:** `/opt/docker/arcane/backup-cron.sh` — iteruje po **wszystkich** wolumenach Docker via Arcane Volume Backup API
- **Cron:** `30 3 * * *` (codziennie 03:30, przed logrotate)
- **Log:** `/var/log/arcane-backup.log`
- **Lokalizacja:** `/opt/backups/arcane/` (bind-mount jako `/backups` w kontenerze Arcane), rotacja **10** kopii na wolumen
- **Off-site:** `rsync -avz root@212.132.103.157:/opt/backups/arcane/ ~/backups/vps-home-pl/`

**Backupowane wolumeny:** `arcane_arcane-data`, `combo_data`, `authentik_authentik-{postgres,redis,media,templates,certs}`.

### Jak zedytować ten schemat

1. Otwórz tę stronę w trybie edycji (BookStack → *Edit*).
2. **Tekst / tabele** — wszystko powyżej jest zwykłym markdown/HTML, edytuj bezpośrednio w WYSIWYG.
3. **Diagram graficzny** — pobierz `env-prod.drawio` z sekcji *Attachments*, otwórz w <https://app.diagrams.net>, zapisz lokalnie, wgraj ponownie jako attachment (nadpisze stary).
4. Po zmianie infrastruktury zaktualizuj tabelę *Stacki Docker* oraz topologię ASCII.