# PV Insight Dashboard fotowoltaiki pod InfluxDB, z naciskiem na prosty dev na Pythonie 3.14 i gotowy deploy produkcyjny bez zewnetrznego CDN. ## Najwazniejsze cechy - dev uruchamiany zwyklym `python run.py` - prod uruchamiany przez `waitress`, bez serwera developerskiego Flask - frontend `React + TypeScript + Vite + ECharts` - stylowanie w oparciu o **Tabler 1.4.0**, zwendorowane **offline** w repo - tryb jasny / ciemny - interfejs PL / EN - logowanie sesyjne - tryb kiosku z recznym doborem widgetow - lokalny cache historii w SQLite - import archiwum z InfluxDB chunkami ## Co aplikacja liczy sama Aplikacja nie wymaga encji typu `energy_today`, `energy_monthly` czy `energy_yearly`. Najpierw liczy energie z `PV_TOTAL_ENERGY_ENTITY` jako licznika calkowitego, a jesli go nie ma, moze estymowac dane z `PV_AC_POWER_ENTITY`. ## Struktura projektu - `backend/config.py` - glowna konfiguracja, encje i moduly - `backend/run.py` - start developerski - `backend/run_prod.py` - start produkcyjny przez Waitress - `backend/backfill.py` - reczny import historii - `backend/app/routes` - endpointy API - `backend/app/services` - logika Influx, energii, auth i historii - `backend/app/storage/sqlite_repository.py` - lokalny cache historii - `frontend/src` - UI operatora, kiosk, logowanie, i18n - `frontend/public/vendor/tabler` - lokalny, offline Tabler - `frontend/nginx.conf` - serwowanie SPA i proxy `/api` w prod - `scripts/dev_*.sh` - start developerski - `scripts/prod_*.sh` - build / start produkcyjny ## Konfiguracja 1. Skopiuj `.env.example` do `.env` 2. Uzupelnij polaczenie do InfluxDB 3. Ustaw encje PV 4. Ustaw login i haslo do panelu Najwazniejsze pola: - `INFLUXDB_*` - `PV_AC_POWER_ENTITY` - `PV_TOTAL_ENERGY_ENTITY` - `PV_STRING_1_*`, `PV_STRING_2_*`, `PV_STRING_3_*`, `PV_STRING_4_*` - `PV_INVERTER_TEMP_ENTITY` opcjonalnie - `APP_SQLITE_PATH` - `HISTORY_*` - `AUTH_USERNAME` - `AUTH_PASSWORD` lub `AUTH_PASSWORD_HASH` - `APP_SECRET_KEY` - `AUTH_COOKIE_SECURE` Dla HTTPS w produkcji ustaw `AUTH_COOKIE_SECURE=true`. Flask wyraznie zaznacza, ze w produkcji nie nalezy uzywac wbudowanego dev servera, tylko dedykowany serwer WSGI, a Waitress dobrze pasuje do tego projektu jako prosty, czysto pythonowy serwer WSGI. ## Dev bez Dockera ### Backend ```bash cp .env.example .env ./scripts/dev_backend.sh ``` ### Frontend W drugim terminalu: ```bash ./scripts/dev_frontend.sh ``` ### Razem ```bash ./scripts/dev.sh ``` ### Demo UI bez backendu ```bash ./scripts/dev_frontend_demo.sh ``` ## Lokalny smoke-test builda bez Dockera ### Backend przez Waitress ```bash ./scripts/prod_backend.sh ``` ### Build frontendu ```bash ./scripts/prod_frontend_build.sh ``` ### Podglad zbudowanego frontendu ```bash ./scripts/prod_frontend_preview.sh ``` Po buildzie frontend statyczny bedzie w `frontend/dist`. To jest dobre do lokalnego sprawdzenia builda. Docelowy deploy produkcyjny jest opisany nizej w sekcji Docker / deploy produkcyjny. ## Docker / deploy produkcyjny Domyslny `docker-compose.yml` jest przygotowany pod prosty deploy produkcyjny: - backend: `Flask + Waitress` - frontend: `nginx` serwujacy build Vite - `nginx` proxuje `/api/*` do backendu - Tabler jest lokalny, wiec nie ma zaleznosci od CDN Start: ```bash docker compose up -d --build ``` UI bedzie pod adresem: ```text http://localhost:8080 ``` Zatrzymanie: ```bash ./scripts/prod_down.sh ``` ## Docker dev Jesli chcesz kontenery developerskie: ```bash docker compose -f docker-compose.dev.yml up --build ``` ## Import historii Z UI: zakladka `Ustawienia` -> `Import archiwalny z InfluxDB` Z CLI: ```bash ./scripts/import_history.sh --start-date 2022-01-01 --end-date 2025-12-31 --chunk-days 7 ``` ## Uwagi - jesli masz mniej stringow, ustaw tylko istniejace encje - gdy temperatura falownika nie istnieje, modul temperatury schowa sie automatycznie - kiosk zapisuje widok lokalnie w `localStorage` - backend trzyma cache dziennych agregatow w SQLite - frontend w dev na porcie `5173` automatycznie gada z backendem na tym samym hoscie, port `8105` - frontend w prod korzysta domyslnie z `/api/v1`, czyli przez proxy nginx ## cd backend export FLASK_APP=app.main:app python -m flask create-admin --username admin2 --password 'SuperHaslo123' python -m flask create-user --username user1 --password 'SuperHaslo123' python -m flask reset-password --username user1 --password 'NoweHaslo123' ## Produkcja Uruchomienie produkcyjne przez reverse proxy: ```bash docker compose -f docker-compose.prod.yml up -d --build ```