Compare commits
1 commit
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
709f362194 |
20 changed files with 8127 additions and 191 deletions
65
.gitignore
vendored
Normal file
65
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
# Python
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
*.so
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
|
||||
# Virtual Environment
|
||||
venv/
|
||||
ENV/
|
||||
env/
|
||||
.venv
|
||||
|
||||
# Flask
|
||||
instance/
|
||||
.webassets-cache
|
||||
|
||||
# Environment Variables
|
||||
.env
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# Database
|
||||
*.db
|
||||
*.sqlite
|
||||
*.sqlite3
|
||||
|
||||
# IDE
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
nohup.out
|
||||
|
||||
# Testing
|
||||
.pytest_cache/
|
||||
.coverage
|
||||
htmlcov/
|
||||
|
||||
# Backups
|
||||
*.backup
|
||||
*.bak
|
||||
97
CHANGELOG.md
Normal file
97
CHANGELOG.md
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
# Changelog
|
||||
|
||||
All notable changes to UrNetwork Stats Dashboard will be documented in this file.
|
||||
|
||||
## [2.1.1] - 2024-11-21
|
||||
|
||||
### ✨ Added
|
||||
- **Chart Interaction Mode** - Tooltips now show anywhere on chart, not just on data points
|
||||
- Custom tooltip callbacks with formatted values (3 decimal places + GB unit)
|
||||
- Better touch/mobile experience for charts
|
||||
- Login button in header when not logged in
|
||||
|
||||
### 🎨 Improved
|
||||
- **Chart Text Visibility** - All text now white (#ffffff) instead of gray
|
||||
- Chart axis labels now #e5e7eb for better readability
|
||||
- Legend text is bold (weight 500) and larger (13px)
|
||||
- Tooltip styling with dark background and blue border (#3b82f6)
|
||||
- Login button styling (blue, prominent)
|
||||
|
||||
### 🔧 Fixed
|
||||
- **Daily Cleanup** - Changed from weekly (Sunday) to daily (3 AM)
|
||||
- Keeps only last 7 days of data automatically
|
||||
- Chart text no longer black/invisible on dark background
|
||||
|
||||
### 📊 Technical
|
||||
- Added `interaction.mode = 'index'` to all charts
|
||||
- Added `interaction.intersect = false` for easier tooltip display
|
||||
- Improved tooltip configuration with better colors and padding
|
||||
- Login button CSS with `.login-btn` class
|
||||
|
||||
---
|
||||
|
||||
## [2.1.0] - 2024-11-20
|
||||
|
||||
### 🎯 Major Changes
|
||||
- **Clean Design** - Removed gradients, switched to solid Cloudflare-inspired colors
|
||||
- Changed from purple (#667eea) to blue (#3b82f6) theme
|
||||
- Solid background (#0c0d0e) instead of gradient
|
||||
- Removed all glassmorphism/blur effects
|
||||
|
||||
### 📊 Chart Improvements
|
||||
- Better visibility with new color scheme
|
||||
- Increased chart line width from 1px to 2px
|
||||
- Better contrast for data visualization
|
||||
- Optimized for dark theme readability
|
||||
|
||||
### 🎨 Design Updates
|
||||
- New stat cards without gradient backgrounds
|
||||
- Simplified header design
|
||||
- Cleaner button styles
|
||||
- Better border colors (#2d3135)
|
||||
- Improved text colors
|
||||
|
||||
---
|
||||
|
||||
## [2.0.0] - 2024-11-15
|
||||
|
||||
### 🎯 Multi-Account Support (MAJOR UPDATE)
|
||||
- Track unlimited UrNetwork accounts simultaneously
|
||||
- Account management UI
|
||||
- Individual charts per account
|
||||
- Combined statistics
|
||||
- Account nicknames
|
||||
- Color-coded accounts
|
||||
|
||||
### 🔐 Authentication Overhaul
|
||||
- Separate admin password
|
||||
- Secure session management
|
||||
- Account-level authentication
|
||||
|
||||
### 📊 Dashboard Enhancements
|
||||
- React-powered private dashboard
|
||||
- View modes (combined, paid/unpaid, delta)
|
||||
- Chart visibility toggles
|
||||
- Improved layout
|
||||
|
||||
### 💾 Database Changes
|
||||
- Multi-account schema
|
||||
- Foreign key relationships
|
||||
- Migration script from v1.0
|
||||
- Data preservation
|
||||
|
||||
---
|
||||
|
||||
## [1.0.0] - 2024-10-01
|
||||
|
||||
### Initial Release
|
||||
- Single account tracking
|
||||
- Basic charts
|
||||
- Public/private dashboard
|
||||
- SQLite database
|
||||
- Webhook support
|
||||
- Web installer
|
||||
|
||||
---
|
||||
|
||||
**Full documentation:** [README.md](README.md)
|
||||
233
CHART_INTERACTION.md
Normal file
233
CHART_INTERACTION.md
Normal file
|
|
@ -0,0 +1,233 @@
|
|||
# 🎯 Graf Tooltip Vylepšení - v2.1.1
|
||||
|
||||
## ✨ Co se změnilo
|
||||
|
||||
### PŘED
|
||||
```
|
||||
Tooltip se zobrazí JEN když najedeš přímo na datový bod (malý kolečko)
|
||||
❌ Musíš přesně trefit bod
|
||||
❌ Obtížné na mobilech
|
||||
❌ Frustrující když je hodně bodů blízko sebe
|
||||
```
|
||||
|
||||
### PO
|
||||
```
|
||||
Tooltip se zobrazí KDEKOLIV na grafu
|
||||
✅ Stačí najet myší kamkoliv na graf
|
||||
✅ Automaticky najde nejbližší data
|
||||
✅ Mnohem lepší UX!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Technické Řešení
|
||||
|
||||
Přidal jsem **Chart.js interaction mode**:
|
||||
|
||||
```javascript
|
||||
interaction: {
|
||||
mode: 'index', // Najde všechny datasety na indexu
|
||||
intersect: false // Nemusíš trefit přesně bod
|
||||
}
|
||||
```
|
||||
|
||||
### Vysvětlení:
|
||||
- **`mode: 'index'`** - Zobrazí tooltip pro všechny datasety na daném X indexu
|
||||
- **`intersect: false`** - Tooltip se zobrazí i když nejsi přímo nad čárou
|
||||
|
||||
---
|
||||
|
||||
## 📊 Jak to funguje
|
||||
|
||||
### Single Dataset Graf (např. Total Data)
|
||||
```
|
||||
Graf: ──────●──────●──────●──────
|
||||
│ │ │ │
|
||||
Myš: │ ← zde → │ │
|
||||
│ │ │ │
|
||||
└─────┴──────┴──────┘
|
||||
Tooltip se ukáže u nejbližšího bodu
|
||||
```
|
||||
|
||||
### Multi Dataset Graf (např. Paid vs Unpaid)
|
||||
```
|
||||
Paid: ──────●──────●──────●──────
|
||||
Unpaid: ──────●──────●──────●──────
|
||||
│ │ │ │
|
||||
Myš: │ ← zde → │ │
|
||||
│ │ │ │
|
||||
|
||||
Tooltip ukáže:
|
||||
Nov 9, 05:52 PM
|
||||
━━━━━━━━━━━━━━
|
||||
💰 Paid: 1.234 GB
|
||||
📡 Unpaid: 0.567 GB
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Bonus - Formátované Hodnoty
|
||||
|
||||
Přidal jsem také custom callback pro lepší formátování:
|
||||
|
||||
```javascript
|
||||
callbacks: {
|
||||
label: function(context) {
|
||||
let label = context.dataset.label || '';
|
||||
if (label) {
|
||||
label += ': ';
|
||||
}
|
||||
if (context.parsed.y !== null) {
|
||||
label += context.parsed.y.toFixed(3) + ' GB';
|
||||
}
|
||||
return label;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Výsledek:**
|
||||
```
|
||||
// PŘED
|
||||
Paid Data: 1.23456789
|
||||
|
||||
// PO
|
||||
Paid Data: 1.235 GB ← Vždy 3 des. místa + jednotka
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📱 Výhody
|
||||
|
||||
### Desktop
|
||||
✅ Rychlejší interakce - nemusíš lovit malé body
|
||||
✅ Přesnější - ukazuje nejbližší hodnotu
|
||||
✅ Plynulejší - tooltip plynule sleduje myš
|
||||
|
||||
### Mobile/Touch
|
||||
✅ Funguje s touch - stačí klepnout kamkoliv
|
||||
✅ Větší "hit area" - není potřeba trefit malý bod
|
||||
✅ Lepší UX na menších obrazovkách
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Kde to funguje
|
||||
|
||||
Toto vylepšení je aplikováno na **VŠECHNY grafy**:
|
||||
|
||||
### Veřejný Dashboard:
|
||||
- ✅ Total Data Provided (GB)
|
||||
- ✅ Individual Account Charts
|
||||
|
||||
### Privátní Dashboard:
|
||||
- ✅ Paid vs Unpaid Data
|
||||
- ✅ Delta Chart
|
||||
- ✅ Combined Chart
|
||||
- ✅ Individual Account Charts
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Vyzkoušej
|
||||
|
||||
1. **Otevři dashboard**
|
||||
2. **Najdi graf**
|
||||
3. **Jeď myší kdekoliv na grafu** (nemusíš trefit bod)
|
||||
4. **Tooltip se okamžitě ukáže** s nejbližšími daty!
|
||||
|
||||
### Test Multi-Dataset:
|
||||
Na grafu s více čarami (Paid vs Unpaid):
|
||||
- Jeď myší horizontálně přes graf
|
||||
- Tooltip ukáže **obě** hodnoty najednou
|
||||
- Vidíš data pro všechny datasety v daném čase
|
||||
|
||||
---
|
||||
|
||||
## 💡 Pro Tipy
|
||||
|
||||
### Rychlé Porovnání
|
||||
Na multi-dataset grafu můžeš rychle porovnat hodnoty:
|
||||
```
|
||||
Jeď myší zleva doprava →
|
||||
Tooltip plynule ukazuje jak se mění obě hodnoty
|
||||
```
|
||||
|
||||
### Přesné Hodnoty
|
||||
I když jsou body blízko sebe:
|
||||
```
|
||||
[●●●●●] ← Těsně u sebe
|
||||
Tooltip vždy ukáže správný nejbližší bod
|
||||
```
|
||||
|
||||
### Mobile
|
||||
Na mobilech:
|
||||
```
|
||||
Klepni kamkoliv na graf
|
||||
→ Tooltip se ukáže
|
||||
Jeď prstem po grafu
|
||||
→ Tooltip sleduje tvůj prst
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Interaction Modes
|
||||
|
||||
Pro tvou informaci, Chart.js nabízí různé režimy:
|
||||
|
||||
| Mode | Popis | Použití |
|
||||
|------|-------|---------|
|
||||
| `'point'` | Jen přesný bod | Původní chování ❌ |
|
||||
| `'nearest'` | Nejbližší bod | Stále musíš být blízko |
|
||||
| **`'index'`** | **Celý index** | **← Používáme! ✅** |
|
||||
| `'dataset'` | Celý dataset | Pro srovnání |
|
||||
| `'x'` / `'y'` | Podle osy | Specifické případy |
|
||||
|
||||
**Proč `'index'`?**
|
||||
- Nejlepší pro časové grafy
|
||||
- Ukáže všechny datasety najednou
|
||||
- Nejintuitivnější pro uživatele
|
||||
|
||||
---
|
||||
|
||||
## 📊 Příklad Output
|
||||
|
||||
### Single Chart:
|
||||
```
|
||||
Nov 21, 01:37 PM
|
||||
━━━━━━━━━━━━━━━━
|
||||
Total Data: 169.134 GB
|
||||
```
|
||||
|
||||
### Multi Chart:
|
||||
```
|
||||
Nov 21, 01:37 PM
|
||||
━━━━━━━━━━━━━━━━
|
||||
💰 Paid (GB): 123.456 GB
|
||||
📡 Unpaid (GB): 45.678 GB
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Instalace
|
||||
|
||||
Už je zahrnuté v **main_clean.py v2.1.1**!
|
||||
|
||||
```bash
|
||||
cd ~/urio
|
||||
cp /path/to/main_clean.py main.py
|
||||
pkill -f main.py
|
||||
python3 main.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Changelog
|
||||
|
||||
### v2.1.1 - 2024-11-21
|
||||
- ✅ Added `interaction.mode = 'index'` to all charts
|
||||
- ✅ Added `interaction.intersect = false` for easier tooltip display
|
||||
- ✅ Added custom tooltip callback for formatted values (3 decimal places)
|
||||
- ✅ Improved mobile/touch experience
|
||||
- ✅ Applied to both public and private dashboard charts
|
||||
|
||||
---
|
||||
|
||||
**Výsledek: Mnohem lepší UX! Tooltip se ukáže kdekoliv najedeš myší na graf! 🎉**
|
||||
258
DESIGN_COMPARISON.md
Normal file
258
DESIGN_COMPARISON.md
Normal file
|
|
@ -0,0 +1,258 @@
|
|||
# 🎨 Design Update - Clean Cloudflare Style
|
||||
|
||||
## 🔥 Co bylo opraveno
|
||||
|
||||
### Problémy ve v2.0:
|
||||
1. ❌ **Gradient pozadí** - tmavý fialový gradient byl příliš tmavý
|
||||
2. ❌ **Fialové barvy** - grafy byly špatně viditelné
|
||||
3. ❌ **Glassmorphism efekty** - příliš mnoho blur efektů
|
||||
4. ❌ **Přemrštěné animace** - karty se příliš pohybovaly
|
||||
|
||||
### ✅ Nový Clean Design:
|
||||
1. ✅ **Čisté tmavé pozadí** - bez gradientu (#0c0d0e)
|
||||
2. ✅ **Modré téma** - lépe viditelné grafy (#3b82f6)
|
||||
3. ✅ **Minimální efekty** - čistý, profesionální vzhled
|
||||
4. ✅ **Jemné animace** - subtilní hover efekty
|
||||
|
||||
---
|
||||
|
||||
## 📥 Soubory
|
||||
|
||||
### Hlavní Verze
|
||||
|
||||
**[main_clean.py](computer:///mnt/user-data/outputs/main_clean.py)** - ✨ **NOVÁ ČISTÁ VERZE**
|
||||
- Bez gradientu v pozadí
|
||||
- Modrá barva místo fialové
|
||||
- Lépe viditelné grafy
|
||||
- Inspirováno Cloudflare dashboardem
|
||||
- **Doporučeno k použití!**
|
||||
|
||||
**[main_enhanced.py](computer:///mnt/user-data/outputs/main_enhanced.py)** - Původní v2.0
|
||||
- S gradientem a glassmorphism
|
||||
- Fialové téma
|
||||
- Více efektů
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Vizuální Srovnání
|
||||
|
||||
### Barvy
|
||||
|
||||
**Původní (v2.0 - Fialová):**
|
||||
```css
|
||||
--primary: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
|
||||
```
|
||||
|
||||
**Nová (Clean - Modrá):**
|
||||
```css
|
||||
--primary: #3b82f6; /* Čistá modrá */
|
||||
background: #0c0d0e; /* Bez gradientu */
|
||||
```
|
||||
|
||||
### Grafy
|
||||
|
||||
**Původní:**
|
||||
- Fialová čára: `#667eea`
|
||||
- Slabá viditelnost na tmavém gradientu
|
||||
- Málo kontrastu
|
||||
|
||||
**Nová:**
|
||||
- Modrá čára: `#3b82f6`
|
||||
- Silnější bordura (2px místo 1px)
|
||||
- Vyšší kontrast
|
||||
- Lépe viditelné body na grafu
|
||||
|
||||
### Karty
|
||||
|
||||
**Původní:**
|
||||
```css
|
||||
background: linear-gradient(135deg, rgba(102, 126, 234, 0.1) 0%, ...);
|
||||
backdrop-filter: blur(10px);
|
||||
transform: translateY(-5px); /* Příliš mnoho pohybu */
|
||||
```
|
||||
|
||||
**Nová:**
|
||||
```css
|
||||
background: #16181a; /* Čistá barva */
|
||||
/* Bez blur */
|
||||
/* Jemné hover efekty */
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Instalace Clean Verze
|
||||
|
||||
### Pro NOVOU instalaci:
|
||||
```bash
|
||||
cd ~/urnetwork-stats
|
||||
|
||||
# Stáhni main_clean.py
|
||||
# Přejmenuj na main.py
|
||||
mv main_clean.py main.py
|
||||
|
||||
python3 main.py
|
||||
```
|
||||
|
||||
### Pro UPGRADE z v2.0:
|
||||
```bash
|
||||
cd ~/urio
|
||||
|
||||
# Zazálohuj současnou verzi
|
||||
cp main.py main_gradient_backup.py
|
||||
|
||||
# Nahraď čistou verzí
|
||||
cp /path/to/main_clean.py main.py
|
||||
|
||||
# Restartuj
|
||||
pkill -f main.py
|
||||
python3 main.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Klíčové Změny v CSS
|
||||
|
||||
### 1. Pozadí
|
||||
```css
|
||||
/* PŘED */
|
||||
body {
|
||||
background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
|
||||
background-attachment: fixed;
|
||||
}
|
||||
|
||||
/* PO */
|
||||
body {
|
||||
background: #0c0d0e; /* Čistá tmavá */
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Primární Barva
|
||||
```css
|
||||
/* PŘED */
|
||||
--primary: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
|
||||
/* PO */
|
||||
--primary: #3b82f6; /* Modrá Cloudflare style */
|
||||
```
|
||||
|
||||
### 3. Stat Karty
|
||||
```css
|
||||
/* PŘED */
|
||||
.stat-card {
|
||||
background: linear-gradient(135deg, rgba(102, 126, 234, 0.1) 0%, rgba(118, 75, 162, 0.1) 100%);
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
.stat-card:hover {
|
||||
transform: translateY(-5px);
|
||||
}
|
||||
|
||||
/* PO */
|
||||
.stat-card {
|
||||
background: #16181a; /* Čistý solid */
|
||||
}
|
||||
.stat-card:hover {
|
||||
border-color: #3b82f6; /* Jemný highlight */
|
||||
}
|
||||
```
|
||||
|
||||
### 4. Grafy
|
||||
```css
|
||||
/* PŘED */
|
||||
borderColor: '#667eea', /* Fialová */
|
||||
backgroundColor: 'rgba(102, 126, 234, 0.2)',
|
||||
|
||||
/* PO */
|
||||
borderColor: '#3b82f6', /* Modrá */
|
||||
backgroundColor: 'rgba(59, 130, 246, 0.15)', /* Světlejší pro kontrast */
|
||||
borderWidth: 2, /* Silnější čára */
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💡 Design Principy
|
||||
|
||||
### Clean Design Philosophy:
|
||||
1. **Méně je více** - Bez zbytečných efektů
|
||||
2. **Čitelnost** - Vysoký kontrast, jasné barvy
|
||||
3. **Konzistence** - Jednotný barevný systém
|
||||
4. **Cloudflare inspirace** - Profesionální, čistý vzhled
|
||||
|
||||
### Cloudflare Color System:
|
||||
```css
|
||||
Background: #0c0d0e (Hlavní pozadí)
|
||||
Secondary BG: #16181a (Karty)
|
||||
Card BG: #1a1d1f (Content boxy)
|
||||
Border: #2d3135 (Okraje)
|
||||
Primary: #3b82f6 (Modrá)
|
||||
Text: #e5e7eb (Světlý text)
|
||||
Text Muted: #9ca3af (Tlumený text)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Rollback na Gradient Verzi
|
||||
|
||||
Pokud preferuješ původní gradient design:
|
||||
|
||||
```bash
|
||||
cd ~/urio
|
||||
|
||||
# Použij original verzi
|
||||
cp main_gradient_backup.py main.py
|
||||
|
||||
# Nebo použij main_enhanced.py
|
||||
cp /path/to/main_enhanced.py main.py
|
||||
|
||||
python3 main.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Porovnání Výkonu
|
||||
|
||||
### Rendering Speed:
|
||||
- **Clean**: Rychlejší (bez blur efektů)
|
||||
- **Gradient**: Pomalejší (backdrop-filter je náročný)
|
||||
|
||||
### Čitelnost Grafů:
|
||||
- **Clean**: ⭐⭐⭐⭐⭐ (Vynikající)
|
||||
- **Gradient**: ⭐⭐⭐ (Průměrná)
|
||||
|
||||
### Professional Look:
|
||||
- **Clean**: ⭐⭐⭐⭐⭐ (Cloudflare style)
|
||||
- **Gradient**: ⭐⭐⭐⭐ (Moderní, ale ne pro všechny)
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Customizace
|
||||
|
||||
Chceš jiné barvy? Změň v main_clean.py:
|
||||
|
||||
```css
|
||||
:root {
|
||||
--primary: #3b82f6; ← Změň na jinou barvu
|
||||
/* Příklady: */
|
||||
/* Zelená: #10b981 */
|
||||
/* Fialová: #8b5cf6 */
|
||||
/* Červená: #ef4444 */
|
||||
/* Oranžová: #f59e0b */
|
||||
}
|
||||
```
|
||||
|
||||
Vše ostatní se automaticky přizpůsobí!
|
||||
|
||||
---
|
||||
|
||||
## ✅ Doporučení
|
||||
|
||||
Pro většinu uživatelů doporučuji **main_clean.py**:
|
||||
- ✅ Lépe viditelné grafy
|
||||
- ✅ Čistší design
|
||||
- ✅ Rychlejší rendering
|
||||
- ✅ Profesionální vzhled
|
||||
- ✅ Inspirováno Cloudflare
|
||||
|
||||
---
|
||||
|
||||
**Vytvořeno s důrazem na čitelnost a profesionální vzhled! 🎉**
|
||||
313
DOWNLOAD_SUMMARY.md
Normal file
313
DOWNLOAD_SUMMARY.md
Normal file
|
|
@ -0,0 +1,313 @@
|
|||
# 🎉 UrNetwork Stats Dashboard v2.1.1 - Complete Package Ready!
|
||||
|
||||
## ✅ Všechny Soubory Připraveny ke Stažení
|
||||
|
||||
Kompletní balík souborů pro UrNetwork Stats Dashboard v2.1.1 je připraven!
|
||||
|
||||
---
|
||||
|
||||
## 📦 Seznam Souborů (18 souborů)
|
||||
|
||||
### 🐍 Hlavní Aplikace (2 soubory)
|
||||
|
||||
1. **[main_clean.py](computer:///mnt/user-data/outputs/main_clean.py)** - 87 KB ⭐ **POUŽIJ TENTO!**
|
||||
- Přejmenuj na `main.py`
|
||||
- Clean Cloudflare design
|
||||
- Bílý text na grafech
|
||||
- Tooltip kdekoliv
|
||||
- Denní cleanup
|
||||
|
||||
2. **[main_enhanced.py](computer:///mnt/user-data/outputs/main_enhanced.py)** - 85 KB
|
||||
- Alternativa s gradienty
|
||||
- Fialové téma
|
||||
- Volitelný
|
||||
|
||||
---
|
||||
|
||||
### 📖 Dokumentace (12 souborů)
|
||||
|
||||
3. **[README.md](computer:///mnt/user-data/outputs/README.md)** - 10 KB
|
||||
- Hlavní anglický README
|
||||
- Kompletní dokumentace
|
||||
|
||||
4. **[README_CZ.md](computer:///mnt/user-data/outputs/README_CZ.md)** - 5.3 KB
|
||||
- Český README
|
||||
- Úplná česká dokumentace
|
||||
|
||||
5. **[FILE_INDEX.md](computer:///mnt/user-data/outputs/FILE_INDEX.md)** - 8.1 KB ⭐
|
||||
- **ZAČNI ODTUD!**
|
||||
- Přehled všech souborů
|
||||
- Instalační návod
|
||||
- Checklist
|
||||
|
||||
6. **[QUICKSTART.md](computer:///mnt/user-data/outputs/QUICKSTART.md)** - 5.2 KB
|
||||
- Rychlý start za 5 minut
|
||||
|
||||
7. **[WEBHOOK_GUIDE.md](computer:///mnt/user-data/outputs/WEBHOOK_GUIDE.md)** - 7.9 KB
|
||||
- 10+ webhook příkladů
|
||||
- Discord, Slack, Telegram
|
||||
|
||||
8. **[DESIGN_COMPARISON.md](computer:///mnt/user-data/outputs/DESIGN_COMPARISON.md)** - 5.3 KB
|
||||
- Srovnání designů
|
||||
- Proč tento design?
|
||||
|
||||
9. **[CHART_INTERACTION.md](computer:///mnt/user-data/outputs/CHART_INTERACTION.md)** - 5.2 KB
|
||||
- Tooltip vylepšení
|
||||
- Jak to funguje
|
||||
|
||||
10. **[FIXES_v2.1.md](computer:///mnt/user-data/outputs/FIXES_v2.1.md)** - 6.7 KB
|
||||
- Všechny opravy v2.1
|
||||
|
||||
11. **[UPGRADE_GUIDE.md](computer:///mnt/user-data/outputs/UPGRADE_GUIDE.md)** - 6.7 KB
|
||||
- Migrace z v1.0/v2.0
|
||||
|
||||
12. **[CHANGELOG.md](computer:///mnt/user-data/outputs/CHANGELOG.md)** - 2.7 KB
|
||||
- Historie verzí
|
||||
|
||||
13. **[FIX_INSTANCE_FOLDER.md](computer:///mnt/user-data/outputs/FIX_INSTANCE_FOLDER.md)** - 2.8 KB
|
||||
- Fix pro starší instalace
|
||||
|
||||
14. **[IMMEDIATE_FIX.md](computer:///mnt/user-data/outputs/IMMEDIATE_FIX.md)** - 3.1 KB
|
||||
- Rychlé opravy
|
||||
|
||||
---
|
||||
|
||||
### 🛠️ Instalační Soubory (4 soubory)
|
||||
|
||||
15. **[requirements.txt](computer:///mnt/user-data/outputs/requirements.txt)** - 120 B
|
||||
- Python závislosti
|
||||
- Pro `pip install -r`
|
||||
|
||||
16. **[install.sh](computer:///mnt/user-data/outputs/install.sh)** - 2.8 KB
|
||||
- Automatický instalátor
|
||||
- Bash script
|
||||
|
||||
17. **[.gitignore](computer:///mnt/user-data/outputs/.gitignore)** - *
|
||||
- Git ignore pravidla
|
||||
|
||||
18. **[migrate.py](computer:///mnt/user-data/outputs/migrate.py)** - 11 KB
|
||||
- Migrace z v1.0
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Co Dělat Nyní
|
||||
|
||||
### Krok 1: Stáhnout Všechny Soubory ⬇️
|
||||
|
||||
**Minimální sada (pro rychlý start):**
|
||||
```
|
||||
✅ main_clean.py → přejmenuj na main.py
|
||||
✅ requirements.txt
|
||||
✅ FILE_INDEX.md → přečti FIRST!
|
||||
✅ README.md nebo README_CZ.md
|
||||
```
|
||||
|
||||
**Doporučená sada (kompletní):**
|
||||
```
|
||||
✅ Všech 18 souborů
|
||||
```
|
||||
|
||||
### Krok 2: Instalace 🔧
|
||||
|
||||
```bash
|
||||
# 1. Vytvoř složku
|
||||
mkdir urnetwork-stats
|
||||
cd urnetwork-stats
|
||||
|
||||
# 2. Stáhni soubory do této složky
|
||||
|
||||
# 3. Přejmenuj hlavní soubor
|
||||
mv main_clean.py main.py
|
||||
|
||||
# 4. Spusť instalaci
|
||||
chmod +x install.sh
|
||||
./install.sh
|
||||
|
||||
# NEBO manuálně:
|
||||
pip3 install -r requirements.txt
|
||||
mkdir -p instance
|
||||
|
||||
# 5. Spusť
|
||||
python3 main.py
|
||||
|
||||
# 6. Otevři prohlížeč
|
||||
# http://localhost:90
|
||||
```
|
||||
|
||||
### Krok 3: První Spuštění ⚙️
|
||||
|
||||
1. **Nastav admin heslo** (NENÍ UrNetwork heslo!)
|
||||
2. **Přidej účty** - Menu → Správa Účtů
|
||||
3. **Nastav webhooky** (volitelné) - Menu → Nastavení
|
||||
4. **Hotovo!** 🎉
|
||||
|
||||
---
|
||||
|
||||
## 📋 Checklist Před Nahráním na Server/Repo
|
||||
|
||||
- [ ] Všech 18 souborů staženo
|
||||
- [ ] `main_clean.py` přejmenován na `main.py`
|
||||
- [ ] Vytvořena složka `docs/` (volitelné)
|
||||
- [ ] README.md v root složce
|
||||
- [ ] requirements.txt v root složce
|
||||
- [ ] install.sh má +x práva (`chmod +x install.sh`)
|
||||
- [ ] .gitignore přítomen
|
||||
|
||||
---
|
||||
|
||||
## 📂 Doporučená Struktura Po Stažení
|
||||
|
||||
```
|
||||
urnetwork-stats/ # Root složka
|
||||
├── main.py # ← Z main_clean.py
|
||||
├── requirements.txt
|
||||
├── install.sh
|
||||
├── migrate.py
|
||||
├── .gitignore
|
||||
├── README.md
|
||||
├── README_CZ.md
|
||||
└── docs/ # Volitelná podsložka
|
||||
├── FILE_INDEX.md # ← Začni odtud!
|
||||
├── QUICKSTART.md
|
||||
├── WEBHOOK_GUIDE.md
|
||||
├── DESIGN_COMPARISON.md
|
||||
├── CHART_INTERACTION.md
|
||||
├── FIXES_v2.1.md
|
||||
├── UPGRADE_GUIDE.md
|
||||
├── CHANGELOG.md
|
||||
├── FIX_INSTANCE_FOLDER.md
|
||||
└── IMMEDIATE_FIX.md
|
||||
```
|
||||
|
||||
**Nebo jednodušeji (bez docs/ složky):**
|
||||
```
|
||||
urnetwork-stats/
|
||||
├── main.py
|
||||
├── requirements.txt
|
||||
├── install.sh
|
||||
├── .gitignore
|
||||
├── README.md
|
||||
└── (všechny ostatní .md soubory)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Priority Po Stažení
|
||||
|
||||
### Musíš Přečíst (Povinné):
|
||||
1. **[FILE_INDEX.md](computer:///mnt/user-data/outputs/FILE_INDEX.md)** ⭐ - Začni odtud!
|
||||
2. **[README.md](computer:///mnt/user-data/outputs/README.md)** nebo **[README_CZ.md](computer:///mnt/user-data/outputs/README_CZ.md)** - Hlavní dokumentace
|
||||
|
||||
### Měl bys Přečíst (Doporučené):
|
||||
3. **[QUICKSTART.md](computer:///mnt/user-data/outputs/QUICKSTART.md)** - Rychlý start
|
||||
4. **[WEBHOOK_GUIDE.md](computer:///mnt/user-data/outputs/WEBHOOK_GUIDE.md)** - Webhook setup
|
||||
|
||||
### Můžeš Přečíst Později (Volitelné):
|
||||
5. Ostatní `.md` soubory podle potřeby
|
||||
|
||||
---
|
||||
|
||||
## 💾 Velikost Balíku
|
||||
|
||||
**Celkem:** ~260 KB (všech 18 souborů)
|
||||
- Aplikace (main.py): ~87 KB
|
||||
- Dokumentace: ~70 KB
|
||||
- Skripty: ~15 KB
|
||||
- Ostatní: ~88 KB
|
||||
|
||||
**Minimální sada:** ~97 KB
|
||||
- main.py + requirements.txt + README.md
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Upgrade z Předchozí Verze?
|
||||
|
||||
### Z v1.0 → v2.1:
|
||||
1. Záloha `.env` a databáze
|
||||
2. Stáhni nové soubory
|
||||
3. Přejmenuj `main_clean.py` → `main.py`
|
||||
4. Spusť `python3 migrate.py`
|
||||
5. Restart
|
||||
|
||||
### Z v2.0 → v2.1:
|
||||
1. Záloha `main.py`
|
||||
2. Nahraď `main_clean.py` → `main.py`
|
||||
3. Restart
|
||||
|
||||
📖 **Detaily:** [UPGRADE_GUIDE.md](computer:///mnt/user-data/outputs/UPGRADE_GUIDE.md)
|
||||
|
||||
---
|
||||
|
||||
## 🐛 První Pomoc
|
||||
|
||||
**Problém:** Port 90 obsazený
|
||||
```python
|
||||
# main.py, poslední řádek:
|
||||
app.run(host="0.0.0.0", port=8080, debug=False)
|
||||
```
|
||||
|
||||
**Problém:** Chybí závislosti
|
||||
```bash
|
||||
pip3 install -r requirements.txt
|
||||
```
|
||||
|
||||
**Problém:** Nemůžu se přihlásit
|
||||
```bash
|
||||
echo "ADMIN_PASSWORD=tvoje_heslo" >> .env
|
||||
```
|
||||
|
||||
**Problém:** Grafy bez textu
|
||||
- Ujisti se, že používáš `main_clean.py` (ne `main_enhanced.py`)
|
||||
|
||||
---
|
||||
|
||||
## 📞 Podpora
|
||||
|
||||
- **Dokumentace:** Všechny `.md` soubory
|
||||
- **Issues:** GitHub/Forgejo Issues
|
||||
- **Quick Help:** [FILE_INDEX.md](computer:///mnt/user-data/outputs/FILE_INDEX.md) má FAQ
|
||||
|
||||
---
|
||||
|
||||
## ✨ Co Je Nového v v2.1.1
|
||||
|
||||
- ✅ **Tooltip kdekoliv** na grafu (ne jen na bodech)
|
||||
- ✅ **Bílý text** na grafech (konečně čitelný!)
|
||||
- ✅ **Denní cleanup** (každý den ve 3:00)
|
||||
- ✅ **Login button** v headeru
|
||||
- ✅ Formátované hodnoty (3 des. místa)
|
||||
- ✅ Better mobile/touch UX
|
||||
|
||||
📖 **Detaily:** [FIXES_v2.1.md](computer:///mnt/user-data/outputs/FIXES_v2.1.md)
|
||||
|
||||
---
|
||||
|
||||
## 🎉 Hotovo!
|
||||
|
||||
**Máš všech 18 souborů připravených!**
|
||||
|
||||
**Next Steps:**
|
||||
1. ⬇️ Stáhni všechny soubory
|
||||
2. 📖 Přečti [FILE_INDEX.md](computer:///mnt/user-data/outputs/FILE_INDEX.md)
|
||||
3. 🚀 Spusť instalaci
|
||||
4. 🎊 Užij si!
|
||||
|
||||
---
|
||||
|
||||
**Made with ❤️ and 🤖 AI**
|
||||
|
||||
**Version:** v2.1.1
|
||||
**Date:** November 21, 2024
|
||||
**Author:** Vlastík (mxnticek) + Claude (Anthropic)
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Quick Links
|
||||
|
||||
- [FILE_INDEX.md](computer:///mnt/user-data/outputs/FILE_INDEX.md) - **Začni odtud!**
|
||||
- [README.md](computer:///mnt/user-data/outputs/README.md) - Hlavní dokumentace
|
||||
- [main_clean.py](computer:///mnt/user-data/outputs/main_clean.py) - Hlavní aplikace
|
||||
- [requirements.txt](computer:///mnt/user-data/outputs/requirements.txt) - Závislosti
|
||||
- [WEBHOOK_GUIDE.md](computer:///mnt/user-data/outputs/WEBHOOK_GUIDE.md) - Webhook návod
|
||||
|
||||
**Stáhni vše a jsi ready to go! 🚀**
|
||||
367
FILE_INDEX.md
Normal file
367
FILE_INDEX.md
Normal file
|
|
@ -0,0 +1,367 @@
|
|||
# 📦 UrNetwork Stats Dashboard v2.1.1 - Complete Package
|
||||
|
||||
## 📥 Download All Files
|
||||
|
||||
Toto je kompletní balík souborů pro UrNetwork Stats Dashboard v2.1.1.
|
||||
|
||||
---
|
||||
|
||||
## 📂 Hlavní Soubory
|
||||
|
||||
### 🐍 Aplikace
|
||||
|
||||
**[main_clean.py](computer:///mnt/user-data/outputs/main_clean.py)** - ⭐ **HLAVNÍ SOUBOR**
|
||||
- Kompletní Flask aplikace
|
||||
- Multi-account podpora
|
||||
- Čistý Cloudflare design
|
||||
- Všechny opravy v2.1.1
|
||||
- **Přejmenuj na `main.py` při instalaci!**
|
||||
- Velikost: ~88 KB
|
||||
|
||||
**[main_enhanced.py](computer:///mnt/user-data/outputs/main_enhanced.py)** - Alternativa s gradienty
|
||||
- Verze s fialovým gradientem a glassmorphismem
|
||||
- Pro ty, kdo preferují původní v2.0 design
|
||||
- Velikost: ~86 KB
|
||||
|
||||
---
|
||||
|
||||
### 📖 Dokumentace
|
||||
|
||||
**[README.md](computer:///mnt/user-data/outputs/README.md)** - Hlavní anglický README
|
||||
- Kompletní dokumentace projektu
|
||||
- Quick start guide
|
||||
- Webhook příklady
|
||||
- Troubleshooting
|
||||
|
||||
**[README_CZ.md](computer:///mnt/user-data/outputs/README_CZ.md)** - Český README
|
||||
- Úplná česká dokumentace
|
||||
- Rychlý start
|
||||
- Webhook návod
|
||||
|
||||
**[QUICKSTART.md](computer:///mnt/user-data/outputs/QUICKSTART.md)** - Rychlý start
|
||||
- Instalace za 5 minut
|
||||
- První spuštění
|
||||
- Základní konfigurace
|
||||
|
||||
**[WEBHOOK_GUIDE.md](computer:///mnt/user-data/outputs/WEBHOOK_GUIDE.md)** - Webhook návod
|
||||
- 10+ webhook příkladů
|
||||
- Discord, Slack, Telegram
|
||||
- Dostupné proměnné
|
||||
- Debugging tipy
|
||||
|
||||
**[DESIGN_COMPARISON.md](computer:///mnt/user-data/outputs/DESIGN_COMPARISON.md)** - Design dokumentace
|
||||
- Srovnání v2.0 vs v2.1
|
||||
- Důvody změn
|
||||
- Customizace barev
|
||||
|
||||
**[CHART_INTERACTION.md](computer:///mnt/user-data/outputs/CHART_INTERACTION.md)** - Graf interakce
|
||||
- Tooltip kdekoliv na grafu
|
||||
- Jak to funguje
|
||||
- Mobile optimalizace
|
||||
|
||||
**[FIXES_v2.1.md](computer:///mnt/user-data/outputs/FIXES_v2.1.md)** - Seznam oprav v2.1
|
||||
- Všechny opravy
|
||||
- Před/po srovnání
|
||||
- Technické detaily
|
||||
|
||||
**[UPGRADE_GUIDE.md](computer:///mnt/user-data/outputs/UPGRADE_GUIDE.md)** - Upgrade průvodce
|
||||
- Migrace z v1.0
|
||||
- Upgrade z v2.0
|
||||
- Backup strategie
|
||||
|
||||
**[CHANGELOG.md](computer:///mnt/user-data/outputs/CHANGELOG.md)** - Historie změn
|
||||
- Všechny verze
|
||||
- Co je nového
|
||||
- Breaking changes
|
||||
|
||||
---
|
||||
|
||||
### 🛠️ Instalační Soubory
|
||||
|
||||
**[requirements.txt](computer:///mnt/user-data/outputs/requirements.txt)** - Python závislosti
|
||||
```txt
|
||||
Flask==3.0.0
|
||||
Flask-SQLAlchemy==3.1.1
|
||||
Flask-APScheduler==1.13.1
|
||||
requests==2.31.0
|
||||
python-dateutil==2.8.2
|
||||
gunicorn==21.2.0
|
||||
```
|
||||
|
||||
**[install.sh](computer:///mnt/user-data/outputs/install.sh)** - Automatický instalační script
|
||||
- Kontrola závislostí
|
||||
- Instalace balíčků
|
||||
- Vytvoření složek
|
||||
- Backup existujících dat
|
||||
|
||||
**[.gitignore](computer:///mnt/user-data/outputs/.gitignore)** - Git ignore file
|
||||
- Python cache
|
||||
- Virtual environments
|
||||
- Database files
|
||||
- Environment variables
|
||||
|
||||
---
|
||||
|
||||
### 🔧 Utility Skripty
|
||||
|
||||
**[migrate.py](computer:///mnt/user-data/outputs/migrate.py)** - Migrace z v1.0
|
||||
- Automatický upgrade na v2.0
|
||||
- Zachování dat
|
||||
- Backup tvorba
|
||||
|
||||
**[fix_db_path.py](computer:///mnt/user-data/outputs/fix_db_path.py)** - Fix databázové cesty
|
||||
- Oprava instance folder problémů
|
||||
- Pro starší instalace
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Rychlá Instalace
|
||||
|
||||
### Metoda 1: Automatická (Doporučeno)
|
||||
|
||||
```bash
|
||||
# 1. Stáhni všechny soubory do složky
|
||||
cd urnetwork-stats
|
||||
|
||||
# 2. Přejmenuj main_clean.py na main.py
|
||||
mv main_clean.py main.py
|
||||
|
||||
# 3. Spusť instalační script
|
||||
chmod +x install.sh
|
||||
./install.sh
|
||||
|
||||
# 4. Spusť aplikaci
|
||||
python3 main.py
|
||||
```
|
||||
|
||||
### Metoda 2: Manuální
|
||||
|
||||
```bash
|
||||
# 1. Stáhni soubory
|
||||
cd urnetwork-stats
|
||||
|
||||
# 2. Přejmenuj
|
||||
mv main_clean.py main.py
|
||||
|
||||
# 3. Instaluj závislosti
|
||||
pip3 install -r requirements.txt
|
||||
|
||||
# 4. Vytvoř složky
|
||||
mkdir -p instance
|
||||
|
||||
# 5. Spusť
|
||||
python3 main.py
|
||||
```
|
||||
|
||||
### Metoda 3: S Gunicorn (Produkce)
|
||||
|
||||
```bash
|
||||
# Po instalaci závislostí
|
||||
gunicorn --bind 0.0.0.0:90 --workers 4 main:app
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 Checklist Po Stažení
|
||||
|
||||
- [ ] Stáhnout všechny soubory
|
||||
- [ ] Přejmenovat `main_clean.py` → `main.py`
|
||||
- [ ] Spustit `install.sh` nebo manuální instalaci
|
||||
- [ ] Otevřít `http://localhost:90`
|
||||
- [ ] Nastavit admin heslo
|
||||
- [ ] Přidat UrNetwork účty
|
||||
- [ ] (Volitelné) Nastavit webhooky
|
||||
- [ ] (Volitelné) Přidat do systemd
|
||||
|
||||
---
|
||||
|
||||
## 📊 Struktura Po Instalaci
|
||||
|
||||
```
|
||||
urnetwork-stats/
|
||||
├── main.py # Hlavní aplikace (z main_clean.py)
|
||||
├── main_enhanced.py # Alternativa (volitelné)
|
||||
├── requirements.txt # Závislosti
|
||||
├── install.sh # Instalační script
|
||||
├── migrate.py # Migrace script
|
||||
├── .gitignore # Git ignore
|
||||
├── .env # Config (vytvoří se automaticky)
|
||||
├── instance/
|
||||
│ └── transfer_stats.db # Databáze (vytvoří se automaticky)
|
||||
└── docs/
|
||||
├── README.md
|
||||
├── README_CZ.md
|
||||
├── QUICKSTART.md
|
||||
├── WEBHOOK_GUIDE.md
|
||||
├── DESIGN_COMPARISON.md
|
||||
├── CHART_INTERACTION.md
|
||||
├── FIXES_v2.1.md
|
||||
├── UPGRADE_GUIDE.md
|
||||
└── CHANGELOG.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Co Potřebuješ Minimálně
|
||||
|
||||
Pro základní funkčnost:
|
||||
|
||||
1. **Povinné:**
|
||||
- `main_clean.py` (přejmenuj na `main.py`)
|
||||
- `requirements.txt`
|
||||
|
||||
2. **Doporučené:**
|
||||
- `README.md` nebo `QUICKSTART.md`
|
||||
- `install.sh` (usnadní instalaci)
|
||||
|
||||
3. **Volitelné:**
|
||||
- Všechny ostatní `.md` soubory (dokumentace)
|
||||
- `main_enhanced.py` (alternativní design)
|
||||
- `migrate.py` (jen pokud upgraduješ z v1.0)
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Upgrade z Předchozí Verze
|
||||
|
||||
### Z v1.0 (Single Account)
|
||||
|
||||
```bash
|
||||
# 1. Záloha
|
||||
cp .env .env.backup
|
||||
cp instance/transfer_stats.db instance/transfer_stats.db.backup
|
||||
|
||||
# 2. Stáhnout nové soubory
|
||||
# (všechny soubory z tohoto balíku)
|
||||
|
||||
# 3. Přejmenovat
|
||||
mv main_clean.py main.py
|
||||
|
||||
# 4. Spustit migraci
|
||||
python3 migrate.py
|
||||
|
||||
# 5. Restart
|
||||
python3 main.py
|
||||
```
|
||||
|
||||
### Z v2.0 (Gradient Design)
|
||||
|
||||
```bash
|
||||
# Jednoduše nahraď main.py
|
||||
cp main.py main.py.v2.0.backup
|
||||
mv main_clean.py main.py
|
||||
python3 main.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📖 První Kroky Po Instalaci
|
||||
|
||||
1. **Otevři prohlížeč:** `http://localhost:90`
|
||||
2. **Nastav admin heslo:** (NENÍ to tvé UrNetwork heslo!)
|
||||
3. **Přidej účty:**
|
||||
- Menu → Správa Účtů
|
||||
- Přidat Účet
|
||||
- Zadej UrNetwork email, heslo, přezdívku
|
||||
4. **Nastav webhooky (volitelné):**
|
||||
- Menu → Nastavení
|
||||
- Webhook Management
|
||||
- Přidej Discord/Slack/Telegram URL + payload
|
||||
5. **Hotovo!** Dashboard začne sbírat data každých 15 minut
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Časté Problémy
|
||||
|
||||
### Port 90 je obsazený
|
||||
```python
|
||||
# Změň v main.py poslední řádek:
|
||||
app.run(host="0.0.0.0", port=8080, debug=False)
|
||||
```
|
||||
|
||||
### Chybí závislosti
|
||||
```bash
|
||||
pip3 install Flask Flask-SQLAlchemy Flask-APScheduler requests python-dateutil
|
||||
```
|
||||
|
||||
### Nemůžu se přihlásit
|
||||
```bash
|
||||
# Zkontroluj .env
|
||||
cat .env | grep ADMIN_PASSWORD
|
||||
# Pokud chybí:
|
||||
echo "ADMIN_PASSWORD=tvoje_heslo" >> .env
|
||||
```
|
||||
|
||||
### Grafy neukazují text
|
||||
- Ujisti se, že používáš `main_clean.py` (ne `main_enhanced.py`)
|
||||
- Verze musí být v2.1+
|
||||
|
||||
---
|
||||
|
||||
## 💡 Pro Tipy
|
||||
|
||||
### Rychlé Testování
|
||||
```bash
|
||||
# Spusť bez instalace systemd
|
||||
python3 main.py
|
||||
|
||||
# V produkci použij Gunicorn
|
||||
gunicorn --bind 0.0.0.0:90 main:app
|
||||
```
|
||||
|
||||
### Vývoj
|
||||
```bash
|
||||
# Debug mode
|
||||
python3 main.py # Debug je defaultně vypnutý
|
||||
|
||||
# Pro development změň v main.py:
|
||||
app.run(host="0.0.0.0", port=90, debug=True)
|
||||
```
|
||||
|
||||
### Backup
|
||||
```bash
|
||||
# Před každým upgradem
|
||||
cp .env .env.backup
|
||||
cp instance/transfer_stats.db instance/transfer_stats.db.backup
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📞 Podpora
|
||||
|
||||
- **Issues:** Forgejo Issues
|
||||
- **Dokumentace:** Všechny `.md` soubory v balíku
|
||||
- **Discord:** (pokud máš komunitní server)
|
||||
|
||||
---
|
||||
|
||||
## ✅ Závěrečný Checklist
|
||||
|
||||
Před nahráním na server/repo zkontroluj:
|
||||
|
||||
- [ ] Všechny soubory staženy
|
||||
- [ ] `main_clean.py` přejmenován na `main.py`
|
||||
- [ ] `requirements.txt` přítomen
|
||||
- [ ] `README.md` přítomen
|
||||
- [ ] `install.sh` má +x práva
|
||||
- [ ] `.gitignore` přítomen
|
||||
- [ ] Dokumentace v `docs/` (volitelné)
|
||||
|
||||
---
|
||||
|
||||
## 🎉 Hotovo!
|
||||
|
||||
Máš kompletní balík souborů pro UrNetwork Stats Dashboard v2.1.1!
|
||||
|
||||
**Co dělat dál:**
|
||||
1. Stáhni všechny soubory
|
||||
2. Nahraj na server/do repozitáře
|
||||
3. Spusť instalaci
|
||||
4. Užij si!
|
||||
|
||||
**Made with ❤️ and 🤖 AI**
|
||||
|
||||
---
|
||||
|
||||
**Verze:** v2.1.1
|
||||
**Datum:** 21. listopadu 2024
|
||||
**Autor:** Vlastík (mxnticek) + Claude (Anthropic)
|
||||
287
FIXES_v2.1.md
Normal file
287
FIXES_v2.1.md
Normal file
|
|
@ -0,0 +1,287 @@
|
|||
# ✅ Opravy v main_clean.py - Finální Verze
|
||||
|
||||
## 🎯 Co bylo opraveno
|
||||
|
||||
### 1. ✅ Grafy - Viditelný Text
|
||||
**Problém:** Text na grafech byl černý a skoro neviditelný na tmavém pozadí
|
||||
|
||||
**Oprava:**
|
||||
```javascript
|
||||
// PŘED - Špatně viditelný
|
||||
ticks: { color: 'var(--text-muted)' } // Tmavě šedá
|
||||
legend: { labels: { color: 'var(--text-color)' } } // Není dostatečně světlá
|
||||
|
||||
// PO - Jasně viditelný ✅
|
||||
ticks: { color: '#e5e7eb', font: { size: 12 } } // Světle bílá
|
||||
legend: {
|
||||
labels: {
|
||||
color: '#ffffff', // Čistě bílá
|
||||
font: { size: 13, weight: '500' },
|
||||
padding: 15
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Vylepšení:**
|
||||
- ✅ Osy (X, Y) - bílý text místo šedého
|
||||
- ✅ Legenda - bílý tučný text
|
||||
- ✅ Tooltips - tmavé pozadí s modrým rámečkem
|
||||
- ✅ Větší velikost písma pro lepší čitelnost
|
||||
|
||||
---
|
||||
|
||||
### 2. ✅ Login Tlačítko v Headeru
|
||||
**Problém:** Nebylo jasné, kde se přihlásit, když nejsi přihlášený
|
||||
|
||||
**Oprava:**
|
||||
```html
|
||||
<!-- Když nejsi přihlášený, zobrazí se modré Login tlačítko -->
|
||||
{% if session.logged_in %}
|
||||
<!-- Standardní menu -->
|
||||
{% else %}
|
||||
<a href="/login" class="login-btn">Přihlásit se</a>
|
||||
{% endif %}
|
||||
```
|
||||
|
||||
**CSS:**
|
||||
```css
|
||||
.header-nav a.login-btn {
|
||||
background: #3b82f6; /* Modré pozadí */
|
||||
color: white;
|
||||
font-weight: 600; /* Tučné */
|
||||
}
|
||||
```
|
||||
|
||||
**Výsledek:**
|
||||
- ✅ Viditelné modré tlačítko "Přihlásit se" v headeru
|
||||
- ✅ Zobrazuje se pouze když nejsi přihlášený
|
||||
- ✅ Zmizí po přihlášení
|
||||
|
||||
---
|
||||
|
||||
### 3. ✅ Automatické Mazání Starých Dat
|
||||
**Problém:** Data se mazala jen jednou týdně v neděli
|
||||
|
||||
**Oprava:**
|
||||
```python
|
||||
# PŘED - Jednou týdně
|
||||
@scheduler.task(trigger="cron", day_of_week="sun", hour="0")
|
||||
|
||||
# PO - Každý den ✅
|
||||
@scheduler.task(trigger="cron", hour="3", minute="0")
|
||||
```
|
||||
|
||||
**Jak to funguje:**
|
||||
1. **Každý den ve 3:00 ráno** se spustí cleanup job
|
||||
2. Smaže všechny záznamy **starší než 7 dní**
|
||||
3. Ponechá data z **posledního týdne**
|
||||
4. Loguje kolik záznamů bylo smazáno
|
||||
|
||||
**Příklad:**
|
||||
```
|
||||
Dnes je: 21. listopadu 2024
|
||||
Smaže se: Vše před 14. listopadem 2024
|
||||
Zůstane: 14. - 21. listopadu (poslední 7 dní)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Před & Po - Vizuální Srovnání
|
||||
|
||||
### Grafy - Text
|
||||
```
|
||||
PŘED:
|
||||
┌────────────────────────┐
|
||||
│ Graf │
|
||||
│ (text skoro neviditelný)│
|
||||
│ Osa Y: #9ca3af (tmavá) │
|
||||
│ Osa X: #9ca3af (tmavá) │
|
||||
│ Legenda: #d1d5db │
|
||||
└────────────────────────┘
|
||||
|
||||
PO:
|
||||
┌────────────────────────┐
|
||||
│ Graf │
|
||||
│ (text jasně viditelný!) │
|
||||
│ Osa Y: #e5e7eb (světlá)│
|
||||
│ Osa X: #e5e7eb (světlá)│
|
||||
│ Legenda: #ffffff (bílá)│
|
||||
└────────────────────────┘
|
||||
```
|
||||
|
||||
### Header
|
||||
```
|
||||
PŘED:
|
||||
[Veřejný pohled] (když nejsi přihlášený, není jasné kde se přihlásit)
|
||||
|
||||
PO:
|
||||
[Veřejný pohled] [🔵 Přihlásit se] (jasné modré tlačítko)
|
||||
```
|
||||
|
||||
### Cleanup Schedule
|
||||
```
|
||||
PŘED:
|
||||
Neděle 00:00 → Smaže data starší 7 dní
|
||||
|
||||
PO:
|
||||
Každý den 03:00 → Smaže data starší 7 dní
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Instalace Opravené Verze
|
||||
|
||||
```bash
|
||||
cd ~/urio
|
||||
|
||||
# Zazálohuj současnou verzi
|
||||
cp main.py main.py.before_fixes
|
||||
|
||||
# Nahraď opravenou verzí
|
||||
cp /path/to/main_clean.py main.py
|
||||
|
||||
# Restartuj
|
||||
pkill -f main.py
|
||||
python3 main.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✨ Co se vylepšilo
|
||||
|
||||
### Čitelnost Grafů ⭐⭐⭐⭐⭐
|
||||
- **PŘED**: ⭐⭐ (Text skoro neviditelný)
|
||||
- **PO**: ⭐⭐⭐⭐⭐ (Jasně čitelné vše!)
|
||||
|
||||
### UX - Přihlášení ⭐⭐⭐⭐⭐
|
||||
- **PŘED**: ⭐⭐⭐ (Musíš znát URL /login)
|
||||
- **PO**: ⭐⭐⭐⭐⭐ (Jasné modré tlačítko v headeru)
|
||||
|
||||
### Údržba Databáze ⭐⭐⭐⭐⭐
|
||||
- **PŘED**: ⭐⭐⭐⭐ (Týdně - může se hromadit)
|
||||
- **PO**: ⭐⭐⭐⭐⭐ (Denně - vždy jen poslední týden)
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Technické Detaily
|
||||
|
||||
### Chart.js Konfigurace
|
||||
```javascript
|
||||
// Kompletní chart options pro viditelný text
|
||||
{
|
||||
scales: {
|
||||
y: {
|
||||
ticks: {
|
||||
color: '#e5e7eb', // Světlá barva
|
||||
font: { size: 12 } // Větší písmo
|
||||
},
|
||||
grid: {
|
||||
color: 'rgba(45, 49, 53, 0.3)' // Jemná mřížka
|
||||
}
|
||||
},
|
||||
x: {
|
||||
ticks: {
|
||||
color: '#e5e7eb',
|
||||
font: { size: 11 }
|
||||
}
|
||||
}
|
||||
},
|
||||
plugins: {
|
||||
legend: {
|
||||
labels: {
|
||||
color: '#ffffff', // Bílá
|
||||
font: { size: 13, weight: '500' },
|
||||
padding: 15
|
||||
}
|
||||
},
|
||||
tooltip: {
|
||||
backgroundColor: 'rgba(26, 29, 31, 0.95)', // Tmavé pozadí
|
||||
titleColor: '#ffffff',
|
||||
bodyColor: '#e5e7eb',
|
||||
borderColor: '#3b82f6',
|
||||
borderWidth: 1,
|
||||
padding: 12
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Cleanup Job
|
||||
```python
|
||||
@scheduler.task(
|
||||
id="cleanup_old_stats_job",
|
||||
trigger="cron",
|
||||
hour="3", # Každý den ve 3:00
|
||||
minute="0"
|
||||
)
|
||||
def cleanup_old_stats_job():
|
||||
cutoff_date = datetime.datetime.now() - datetime.timedelta(days=7)
|
||||
# Smaže vše starší než cutoff_date
|
||||
db.session.query(Stats).filter(Stats.timestamp < cutoff_date).delete()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💾 Velikost Databáze
|
||||
|
||||
S denním čištěním:
|
||||
```
|
||||
Stats každých 15 min = 96 záznamů/den
|
||||
7 dní × 96 = 672 záznamů max
|
||||
3 účty × 672 = ~2000 záznamů max
|
||||
|
||||
Velikost: ~200 KB databáze (velmi malá!)
|
||||
```
|
||||
|
||||
Bez čištění (týdně):
|
||||
```
|
||||
Po měsíci: ~8000 záznamů
|
||||
Velikost: ~800 KB (pořád OK, ale zbytečné)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Ověření Změn
|
||||
|
||||
### 1. Grafy
|
||||
```
|
||||
Otevři dashboard → Podívej se na graf
|
||||
✅ Čísla na osách jsou bílá a čitelná
|
||||
✅ Legenda je bílá a tučná
|
||||
✅ Tooltips mají modré ohraničení
|
||||
```
|
||||
|
||||
### 2. Login Tlačítko
|
||||
```
|
||||
Odhlásit se (pokud jsi přihlášený)
|
||||
✅ V headeru se objeví modré tlačítko "Přihlásit se"
|
||||
Přihlásit se
|
||||
✅ Tlačítko zmizí, objeví se menu
|
||||
```
|
||||
|
||||
### 3. Cleanup Job
|
||||
```bash
|
||||
# Zkontroluj logy
|
||||
tail -f nohup.out | grep cleanup
|
||||
|
||||
# Mělo by se objevit každý den ve 3:00
|
||||
# "Running daily stats cleanup job..."
|
||||
# "Successfully deleted X stats records older than 7 days."
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Changelog
|
||||
|
||||
### v2.1 - 2024-11-21
|
||||
- ✅ Fixed chart text visibility (white text instead of dark gray)
|
||||
- ✅ Added Login button to header when not logged in
|
||||
- ✅ Changed cleanup schedule from weekly to daily (3 AM)
|
||||
- ✅ Enhanced tooltip styling with blue borders
|
||||
- ✅ Increased font sizes for better readability
|
||||
|
||||
---
|
||||
|
||||
**Všechno opraveno a připraveno k použití! 🎉**
|
||||
|
||||
Grafy jsou nyní perfektně čitelné, login je viditelný a databáze se čistí každý den automaticky!
|
||||
113
FIX_INSTANCE_FOLDER.md
Normal file
113
FIX_INSTANCE_FOLDER.md
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
# 🔧 Fix: Databáze v instance/ složce
|
||||
|
||||
## Problém
|
||||
Pokud vidíš chybu:
|
||||
```
|
||||
✗ Databáze transfer_stats.db nenalezena!
|
||||
```
|
||||
|
||||
Ale databáze je ve složce `instance/`:
|
||||
```bash
|
||||
ls instance/
|
||||
# transfer_stats.db
|
||||
```
|
||||
|
||||
## Řešení
|
||||
|
||||
Opravený migrační skript již automaticky hledá databázi v těchto lokacích:
|
||||
- `transfer_stats.db` (root složka)
|
||||
- `instance/transfer_stats.db` (Flask standardní umístění)
|
||||
- `../transfer_stats.db` (parent folder)
|
||||
|
||||
### Použij aktualizované soubory
|
||||
|
||||
Právě jsem opravil oba soubory:
|
||||
1. **migrate.py** - Nyní hledá DB v instance/
|
||||
2. **main_enhanced.py** - Používá správnou cestu `sqlite:///instance/transfer_stats.db`
|
||||
|
||||
### Rychlé řešení
|
||||
|
||||
```bash
|
||||
# 1. Stáhni znovu opravené soubory z /mnt/user-data/outputs/
|
||||
# 2. Překopíruj je do ~/urio/
|
||||
cd ~/urio
|
||||
|
||||
# 3. Zkus migraci znovu
|
||||
python3 migrate.py
|
||||
```
|
||||
|
||||
## Alternativní řešení (pokud potřebuješ hned)
|
||||
|
||||
Pokud chceš použít stávající soubory bez stahování nových:
|
||||
|
||||
```bash
|
||||
cd ~/urio
|
||||
|
||||
# Přesuň databázi do root složky
|
||||
cp instance/transfer_stats.db .
|
||||
|
||||
# Spusť migraci
|
||||
python3 migrate.py
|
||||
|
||||
# Po úspěšné migraci, databáze zůstane v root složce
|
||||
# nebo ji vrať do instance/
|
||||
mv transfer_stats.db instance/
|
||||
```
|
||||
|
||||
## Ověření
|
||||
|
||||
Po úspěšné migraci by měl výstup vypadat takto:
|
||||
|
||||
```
|
||||
============================================================
|
||||
Vytváření záloh
|
||||
============================================================
|
||||
✓ Zazálohován .env → .env.backup
|
||||
✓ Zazálohována databáze → instance/transfer_stats.db.backup
|
||||
|
||||
============================================================
|
||||
Migrace databáze
|
||||
============================================================
|
||||
✓ Nalezena databáze: instance/transfer_stats.db
|
||||
✓ Vytvořena tabulka accounts
|
||||
✓ Přidán sloupec account_id do tabulky stats
|
||||
|
||||
Nalezen existující účet: vlastik.novotny2005@gmail.com
|
||||
Zadejte přezdívku pro tento účet: Hlavní účet
|
||||
|
||||
✓ Migrován účet: vlastik.novotny2005@gmail.com
|
||||
✓ Přezdívka: Hlavní účet
|
||||
✓ Aktualizováno X statistických záznamů
|
||||
|
||||
✓ Migrace databáze dokončena!
|
||||
```
|
||||
|
||||
## Nová verze používá instance/ automaticky
|
||||
|
||||
Opravená verze `main_enhanced.py`:
|
||||
```python
|
||||
# Config nyní používá:
|
||||
SQLALCHEMY_DATABASE_URI = "sqlite:///instance/transfer_stats.db"
|
||||
|
||||
# A automaticky vytvoří instance/ složku, pokud neexistuje
|
||||
```
|
||||
|
||||
Takže po migraci vše funguje správně s databází v `instance/` složce.
|
||||
|
||||
## Stáhni opravené soubory
|
||||
|
||||
Všechny soubory v `/mnt/user-data/outputs/` jsou již opravené a ready to use!
|
||||
|
||||
```bash
|
||||
# Zkopíruj opravené soubory
|
||||
cd ~/urio
|
||||
cp /cesta/k/stazenym/migrate.py .
|
||||
cp /cesta/k/stazenym/main_enhanced.py .
|
||||
|
||||
# A spusť migraci znovu
|
||||
python3 migrate.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Tohle by mělo problém vyřešit! Zkus to a dej vědět, jestli to funguje. 🚀
|
||||
129
IMMEDIATE_FIX.md
Normal file
129
IMMEDIATE_FIX.md
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
# 🚑 OKAMŽITÁ OPRAVA - Database Path Error
|
||||
|
||||
## Problém
|
||||
```
|
||||
sqlite3.OperationalError: unable to open database file
|
||||
```
|
||||
|
||||
## ⚡ Rychlé Řešení (30 sekund)
|
||||
|
||||
### Varianta 1: Automatická oprava
|
||||
```bash
|
||||
cd ~/urio
|
||||
python3 fix_db_path.py
|
||||
python3 main.py
|
||||
```
|
||||
|
||||
### Varianta 2: Manuální oprava
|
||||
```bash
|
||||
cd ~/urio
|
||||
|
||||
# Přidej do main.py hned za class Config:
|
||||
# Najdi tuto řádku (řádek ~33):
|
||||
# SQLALCHEMY_DATABASE_URI = os.getenv("DATABASE_URL", "sqlite:///instance/transfer_stats.db")
|
||||
#
|
||||
# A nahraď ji tímto (3 řádky):
|
||||
# BASE_DIR = os.path.abspath(os.path.dirname(__file__))
|
||||
# INSTANCE_DIR = os.path.join(BASE_DIR, 'instance')
|
||||
# SQLALCHEMY_DATABASE_URI = os.getenv("DATABASE_URL", f"sqlite:///{os.path.join(INSTANCE_DIR, 'transfer_stats.db')}")
|
||||
```
|
||||
|
||||
### Varianta 3: Použij opravený soubor
|
||||
```bash
|
||||
cd ~/urio
|
||||
|
||||
# Stáhni znovu main_enhanced.py z outputs/
|
||||
# A přepiš jím současný main.py
|
||||
mv main.py main.py.broken
|
||||
cp /path/to/main_enhanced.py main.py
|
||||
|
||||
python3 main.py
|
||||
```
|
||||
|
||||
## 🔍 Co je problém?
|
||||
|
||||
SQLAlchemy používá relativní cestu `sqlite:///instance/transfer_stats.db`, ale instance folder neexistuje v době, kdy se SQLAlchemy inicializuje.
|
||||
|
||||
## ✅ Co oprava dělá?
|
||||
|
||||
1. **Použije absolutní cestu** místo relativní
|
||||
2. **Vytvoří instance/ folder** PŘED inicializací SQLAlchemy
|
||||
3. **Nastaví správnou cestu** k databázi
|
||||
|
||||
## 📝 Změny v kódu
|
||||
|
||||
### PŘED (nefungující):
|
||||
```python
|
||||
class Config:
|
||||
SQLALCHEMY_DATABASE_URI = "sqlite:///instance/transfer_stats.db"
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config.from_object(Config)
|
||||
# instance folder se vytváří tady ← TOO LATE!
|
||||
```
|
||||
|
||||
### PO (fungující):
|
||||
```python
|
||||
class Config:
|
||||
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
|
||||
INSTANCE_DIR = os.path.join(BASE_DIR, 'instance')
|
||||
SQLALCHEMY_DATABASE_URI = f"sqlite:///{os.path.join(INSTANCE_DIR, 'transfer_stats.db')}"
|
||||
|
||||
# instance folder se vytváří tady ← BEFORE app init!
|
||||
if not os.path.exists(Config.INSTANCE_DIR):
|
||||
os.makedirs(Config.INSTANCE_DIR)
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config.from_object(Config)
|
||||
```
|
||||
|
||||
## 🎯 Ověření
|
||||
|
||||
Po opravě by měl výstup vypadat takto:
|
||||
```bash
|
||||
$ python3 main.py
|
||||
2025-11-21 12:20:51,319 - INFO - Successfully loaded world map GeoJSON data.
|
||||
2025-11-21 12:20:51,450 - INFO - Scheduler started
|
||||
* Serving Flask app 'main'
|
||||
* Running on http://0.0.0.0:90
|
||||
```
|
||||
|
||||
✅ Bez chyby "unable to open database file"!
|
||||
|
||||
## 🆘 Stále nefunguje?
|
||||
|
||||
Zkontroluj:
|
||||
|
||||
```bash
|
||||
# 1. Existuje instance složka?
|
||||
ls -la instance/
|
||||
|
||||
# 2. Jsou v ní správné soubory?
|
||||
ls -la instance/transfer_stats.db*
|
||||
|
||||
# 3. Má Python práva na zápis?
|
||||
touch instance/test.txt && rm instance/test.txt
|
||||
|
||||
# 4. Je databáze validní?
|
||||
sqlite3 instance/transfer_stats.db ".tables"
|
||||
```
|
||||
|
||||
Pokud všechno OK, měl by výstup být:
|
||||
```
|
||||
accounts settings stats webhook
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📦 Aktualizované soubory
|
||||
|
||||
Všechny soubory v `/mnt/user-data/outputs/` jsou již opravené:
|
||||
- ✅ **main_enhanced.py** - Opravená verze
|
||||
- ✅ **fix_db_path.py** - Automatický fix skript
|
||||
- ✅ **migrate.py** - Funguje s instance/
|
||||
|
||||
Stačí je použít a vše bude fungovat!
|
||||
|
||||
---
|
||||
|
||||
**Vyřešilo to problém? Dej mi vědět!** 🚀
|
||||
194
QUICKSTART.md
Normal file
194
QUICKSTART.md
Normal file
|
|
@ -0,0 +1,194 @@
|
|||
# 🚀 UrNetwork Stats Dashboard v2.0 - QUICK START
|
||||
|
||||
## 📦 Balíček obsahuje:
|
||||
|
||||
```
|
||||
urnetwork-stats-v2/
|
||||
├── main_enhanced.py # Hlavní aplikace (přejmenovat na main.py)
|
||||
├── migrate.py # Migrační skript pro upgrade
|
||||
├── install.sh # Instalační skript pro nové instalace
|
||||
├── README_CZ.md # Kompletní dokumentace
|
||||
├── UPGRADE_GUIDE.md # Průvodce upgradem
|
||||
└── QUICKSTART.md # Tento soubor
|
||||
```
|
||||
|
||||
## ⚡ Pro NOVOU instalaci (prázdná složka)
|
||||
|
||||
```bash
|
||||
# 1. Nahrajte všechny soubory do složky
|
||||
cd ~/urnetwork-stats
|
||||
|
||||
# 2. Přejmenujte hlavní soubor
|
||||
mv main_enhanced.py main.py
|
||||
|
||||
# 3. Spusťte instalační skript
|
||||
bash install.sh
|
||||
|
||||
# 4. Spusťte aplikaci
|
||||
python3 main.py
|
||||
|
||||
# 5. Otevřete v prohlížeči
|
||||
http://your-server:90
|
||||
```
|
||||
|
||||
## 🔄 Pro UPGRADE existující instalace
|
||||
|
||||
```bash
|
||||
# 1. Zazálohujte současnou složku
|
||||
cd ~
|
||||
cp -r urio urio_backup
|
||||
|
||||
# 2. Nahrajte POUZE tyto soubory do existující složky:
|
||||
# - main_enhanced.py → přejmenovat na main.py
|
||||
# - migrate.py
|
||||
|
||||
# 3. Zastavte běžící aplikaci
|
||||
pkill -f main.py
|
||||
|
||||
# 4. Spusťte migraci
|
||||
cd ~/urio
|
||||
python3 migrate.py
|
||||
|
||||
# 5. Spusťte novou verzi
|
||||
python3 main.py
|
||||
|
||||
# 6. Přihlaste se novým admin heslem
|
||||
http://your-server:90
|
||||
```
|
||||
|
||||
## 🎯 První kroky po instalaci
|
||||
|
||||
### 1. Nastavení Admin Hesla
|
||||
- Při první návštěvě nastavíte admin heslo
|
||||
- **DŮLEŽITÉ:** Toto není vaše UrNetwork heslo!
|
||||
- Toto heslo používáte pro přihlášení do dashboardu
|
||||
|
||||
### 2. Přidání UrNetwork Účtů
|
||||
```
|
||||
Dashboard → Správa účtů → Přidat účet
|
||||
|
||||
Vyplňte:
|
||||
✓ UrNetwork email (vlastik.novotny2005@gmail.com)
|
||||
✓ UrNetwork heslo
|
||||
✓ Přezdívka (např. "Domácí účet")
|
||||
```
|
||||
|
||||
### 3. Zobrazení Dat
|
||||
- **Veřejný pohled**: Kombinované statistiky všech účtů
|
||||
- **Privátní dashboard**: Detailní grafy a správa
|
||||
- **Správa účtů**: Přidávání/odebírání účtů
|
||||
|
||||
## 🆘 Rychlá pomoc
|
||||
|
||||
### Nemohu se přihlásit
|
||||
```bash
|
||||
# Zkontrolujte .env soubor
|
||||
cat .env | grep ADMIN_PASSWORD
|
||||
|
||||
# Pokud chybí, přidejte
|
||||
echo "ADMIN_PASSWORD=your_password" >> .env
|
||||
```
|
||||
|
||||
### Aplikace neběží
|
||||
```bash
|
||||
# Zkontrolujte logy
|
||||
tail -f nohup.out
|
||||
|
||||
# Nebo spusťte v popředí pro debugging
|
||||
python3 main.py
|
||||
```
|
||||
|
||||
### Port 90 je obsazený
|
||||
```python
|
||||
# V main.py změňte poslední řádek:
|
||||
app.run(host="0.0.0.0", port=8080, debug=False)
|
||||
# ^^^^
|
||||
# Změňte číslo portu
|
||||
```
|
||||
|
||||
### Upgrade selhal
|
||||
```bash
|
||||
# Obnovte zálohu
|
||||
cd ~
|
||||
rm -rf urio
|
||||
mv urio_backup urio
|
||||
cd urio
|
||||
python3 main.py
|
||||
```
|
||||
|
||||
## 📚 Detailní dokumentace
|
||||
|
||||
- **README_CZ.md** - Kompletní feature list a použití
|
||||
- **UPGRADE_GUIDE.md** - Detailní průvodce upgradem
|
||||
- **GitHub Issues** - Pro reportování problémů
|
||||
|
||||
## 🎨 Screenshots
|
||||
|
||||
### Veřejný Dashboard
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ Celkem placených dat │ 45.234 GB │
|
||||
│ Celkem neplacených dat │ 12.456 GB │
|
||||
│ Aktivní účty │ 3 │
|
||||
│ Výdělky (30 dní) │ $125.67 │
|
||||
└─────────────────────────────────────────┘
|
||||
|
||||
Graf: Kombinovaná data ze všech účtů
|
||||
Graf: Domácí účet
|
||||
Graf: Pracovní účet
|
||||
Graf: Server účet
|
||||
|
||||
Mapa: Lokace poskytovatelů
|
||||
```
|
||||
|
||||
### Správa Účtů
|
||||
```
|
||||
┌──────────────────────────────────────────────┐
|
||||
│ Přezdívka │ Username │ Stav │
|
||||
├──────────────────────────────────────────────┤
|
||||
│ [Domácí účet] │ vlastik@... │ Aktivní │
|
||||
│ [Pracovní] │ work@... │ Aktivní │
|
||||
│ [Server] │ server@... │ Neaktivní│
|
||||
└──────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## 🔥 Hlavní Nové Funkce
|
||||
|
||||
✅ **Multi-Account** - Sledujte více UrNetwork účtů
|
||||
✅ **Glassmorphism Design** - Moderní UI s blur efekty
|
||||
✅ **Kombinované Stats** - Agregovaná data všech účtů
|
||||
✅ **Individuální Grafy** - Graf pro každý účet zvlášť
|
||||
✅ **Barevné Odlišení** - Každý účet má svou barvu
|
||||
✅ **Admin Heslo** - Oddělené od UrNetwork credentials
|
||||
✅ **Toggle Účtů** - Zapínání/vypínání sledování
|
||||
✅ **Přezdívky** - Pojmenujte si účty jak chcete
|
||||
|
||||
## 💡 Tipy
|
||||
|
||||
### Pro více než 3 účty
|
||||
- Snižte frekvenci fetchování v kódu (z 15 na 30 minut)
|
||||
- Používejte přezdívky pro lepší přehled
|
||||
|
||||
### Pro produkční nasazení
|
||||
- Nastavte `FORCE_HTTPS=True` v .env
|
||||
- Použijte Gunicorn místo development serveru
|
||||
- Nastavte systemd service pro autostart
|
||||
|
||||
### Webhooky
|
||||
```json
|
||||
{
|
||||
"content": "📊 **${account}**\n💾 Data: ${total_gb} GB\n🕐 ${update_time}"
|
||||
}
|
||||
```
|
||||
|
||||
## 📞 Kontakt & Podpora
|
||||
|
||||
- Original project: techroy23/UrNetwork-Stats-Dashboard
|
||||
- Enhanced by: Claude/Anthropic
|
||||
- Issues & Questions: GitHub Issues
|
||||
|
||||
---
|
||||
|
||||
**Enjoy! 🎉**
|
||||
|
||||
Pro detaily viz README_CZ.md
|
||||
172
README_CZ.md
Normal file
172
README_CZ.md
Normal file
|
|
@ -0,0 +1,172 @@
|
|||
# UrNetwork Stats Dashboard - Vylepšená Multi-Account Verze v2.1
|
||||
|
||||
🇨🇿 **Český README** | [🇬🇧 English README](README.md)
|
||||
|
||||
---
|
||||
|
||||
## 🌟 Rychlé Odkazy
|
||||
|
||||
- 🚀 [Rychlý Start](QUICKSTART.md) - Spusť za 5 minut
|
||||
- 📊 [Návod na Webhooky](WEBHOOK_GUIDE.md) - Discord, Slack, Telegram příklady
|
||||
- 🎨 [Porovnání Designů](DESIGN_COMPARISON.md) - Proč tento design?
|
||||
- 🔄 [Průvodce Upgradem](UPGRADE_GUIDE.md) - Migrace z v1.0
|
||||
- 📝 [Changelog](CHANGELOG.md) - Historie verzí
|
||||
|
||||
---
|
||||
|
||||
## O Projektu
|
||||
|
||||
Toto je **výrazně vylepšená multi-account verze** původního [UrNetwork Stats Dashboard](https://github.com/techroy23/UrNetwork-Stats-Dashboard). Sleduj neomezený počet UrNetwork účtů s krásnými grafy, real-time aktualizacemi a webhook notifikacemi.
|
||||
|
||||
**Co je nového ve v2.1:**
|
||||
- 🎯 **Multi-Account Podpora** - Sleduj neomezený počet UrNetwork účtů
|
||||
- 🎨 **Čistý Design** - Cloudflare-inspirovaný tmavý vzhled
|
||||
- 📊 **Lepší Grafy** - Bílý text, tooltip kdekoliv na grafu
|
||||
- 🔐 **Oddělená Auth** - Admin heslo nezávislé na UrNetwork
|
||||
- ⚡ **Denní Čištění** - Auto-mazání dat starších 7 dní
|
||||
- 📱 **Mobilní Optimalizace** - Touch-friendly rozhraní
|
||||
|
||||
> **Vylepšeno AI:** v2.0+ vytvořeno s Claude (Anthropic) pro lepší UX, multi-account podporu a moderní design.
|
||||
|
||||
---
|
||||
|
||||
## ✨ Klíčové Funkce
|
||||
|
||||
### 🎯 Multi-Account Správa
|
||||
- ✅ Sleduj neomezený počet UrNetwork účtů současně
|
||||
- ✅ Kombinované statistiky ze všech účtů
|
||||
- ✅ Individuální grafy pro každý účet
|
||||
- ✅ Vlastní přezdívky pro snadnou identifikaci
|
||||
- ✅ Zapni/vypni účty bez smazání
|
||||
- ✅ Barevně odlišené pro snadné rozpoznání
|
||||
|
||||
### 📊 Pokročilá Vizualizace
|
||||
- ✅ Interaktivní Chart.js grafy s tooltipem **kdekoliv na grafu**
|
||||
- ✅ Celková data, Placená vs Neplacená, Delta grafy
|
||||
- ✅ Bílý čitelný text na všech grafech (konec mrákání!)
|
||||
- ✅ Mapa světa ukazující lokace poskytovatelů
|
||||
- ✅ Real-time aktualizace každou minutu
|
||||
|
||||
### ⚙️ Automatizace
|
||||
- ✅ Sběr dat každých 15 minut
|
||||
- ✅ Denní čištění (ponechává posledních 7 dní)
|
||||
- ✅ Webhook notifikace (Discord, Slack, Telegram)
|
||||
- ✅ Správa zařízení napříč všemi účty
|
||||
|
||||
### 🎨 Moderní UI
|
||||
- ✅ Čistý Cloudflare-inspirovaný tmavý vzhled
|
||||
- ✅ Bez gradientů (lepší viditelnost grafů)
|
||||
- ✅ Modrá akcent barva (#3b82f6)
|
||||
- ✅ Plně responzivní (mobil, tablet, desktop)
|
||||
- ✅ Podpora češtiny a angličtiny
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Rychlý Start
|
||||
|
||||
```bash
|
||||
# 1. Klonovat repozitář
|
||||
git clone https://forgejo.plainrock127.xyz/mxnticek/UrNetwork-Stats-Dashboard-remade
|
||||
cd UrNetwork-Stats-Dashboard-remade
|
||||
|
||||
# 2. Instalovat závislosti
|
||||
pip install Flask Flask-SQLAlchemy Flask-APScheduler requests python-dateutil
|
||||
|
||||
# 3. Spustit
|
||||
python main.py
|
||||
|
||||
# 4. Otevřít prohlížeč
|
||||
# http://localhost:90
|
||||
```
|
||||
|
||||
**První Spuštění:**
|
||||
1. Nastav své **admin heslo** (NENÍ to tvé UrNetwork heslo!)
|
||||
2. Přidej své UrNetwork účty (email + heslo + přezdívka)
|
||||
3. Hotovo! Dashboard začne sbírat data každých 15 minut
|
||||
|
||||
📖 **Potřebuješ více detailů?** Viz [QUICKSTART.md](QUICKSTART.md)
|
||||
|
||||
---
|
||||
|
||||
## 📊 Nastavení Webhooků - Rychlé Příklady
|
||||
|
||||
### Discord - Jednoduchý
|
||||
```json
|
||||
{
|
||||
"content": "📊 **${account}**: ${total_gb} GB"
|
||||
}
|
||||
```
|
||||
|
||||
### Discord - Bohatý Embed (Doporučeno)
|
||||
```json
|
||||
{
|
||||
"username": "UrNetwork Bot",
|
||||
"embeds": [{
|
||||
"title": "⚡ ${account} - Nová Data!",
|
||||
"color": 3901635,
|
||||
"fields": [
|
||||
{"name": "💰 Placená", "value": "`${paid_gb} GB`", "inline": true},
|
||||
{"name": "📡 Neplacená", "value": "`${unpaid_gb} GB`", "inline": true},
|
||||
{"name": "💾 Celkem", "value": "**${total_gb} GB**", "inline": false}
|
||||
],
|
||||
"footer": {"text": "UrNetwork Stats"},
|
||||
"timestamp": "${update_time}"
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
### Telegram
|
||||
```json
|
||||
{
|
||||
"chat_id": "TVOJE_CHAT_ID",
|
||||
"text": "📊 *${account}*\n💾 Celkem: ${total_gb} GB\n💰 Placená: ${paid_gb} GB\n📡 Neplacená: ${unpaid_gb} GB",
|
||||
"parse_mode": "Markdown"
|
||||
}
|
||||
```
|
||||
|
||||
**Dostupné Proměnné:**
|
||||
- `${account}` - Přezdívka účtu
|
||||
- `${paid_gb}` - Placená data v GB
|
||||
- `${unpaid_gb}` - Neplacená data v GB
|
||||
- `${total_gb}` - Celková data v GB
|
||||
- `${update_time}` - Časová značka
|
||||
|
||||
📖 **Kompletní webhook návod:** [WEBHOOK_GUIDE.md](WEBHOOK_GUIDE.md)
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Proč Tento Design?
|
||||
|
||||
Po rozsáhlém testování jsme zvolili **čistý Cloudflare-inspirovaný design** protože:
|
||||
|
||||
1. **Lepší Viditelnost Grafů** - Pevné tmavé pozadí = lepší kontrast
|
||||
2. **Profesionální Vzhled** - Napodobuje enterprise dashboardy
|
||||
3. **Bez Únav Očí** - Čisté barvy bez gradientů
|
||||
4. **Výkon** - Žádné blur efekty = rychlejší rendering
|
||||
5. **Přístupnost** - Vysoké kontrastní poměry
|
||||
|
||||
**Barevné Schéma:**
|
||||
```css
|
||||
Pozadí: #0c0d0e (Tmavá)
|
||||
Primární: #3b82f6 (Modrá)
|
||||
Text: #e5e7eb (Světlá)
|
||||
Úspěch: #10b981 (Zelená)
|
||||
Chyba: #ef4444 (Červená)
|
||||
```
|
||||
|
||||
📖 **Detaily designu:** [DESIGN_COMPARISON.md](DESIGN_COMPARISON.md)
|
||||
|
||||
---
|
||||
|
||||
## 🙏 Poděkování
|
||||
|
||||
- **Originál:** [techroy23/UrNetwork-Stats-Dashboard](https://github.com/techroy23/UrNetwork-Stats-Dashboard)
|
||||
- **v2.0+ Vylepšeno:** Claude (Anthropic AI)
|
||||
- **Design Inspirace:** Cloudflare, Vercel
|
||||
- **Speciální Díky:** Vlastík (mxnticek) za testování
|
||||
|
||||
---
|
||||
|
||||
**Verze:** v2.1.1 | **Poslední Aktualizace:** 21. listopadu 2024
|
||||
|
||||
**Vytvořeno s ❤️ a 🤖 AI**
|
||||
304
UPGRADE_GUIDE.md
Normal file
304
UPGRADE_GUIDE.md
Normal file
|
|
@ -0,0 +1,304 @@
|
|||
# UrNetwork Stats Dashboard v2.0 - Upgrade Guide
|
||||
|
||||
## 🎯 Hlavní Vylepšení
|
||||
|
||||
### 1. Multi-Account Support ⭐ NOVÉ
|
||||
**Před:**
|
||||
- Sledování pouze jednoho UrNetwork účtu
|
||||
- Nutnost manuálně měnit credentials v .env
|
||||
- Žádná kombinovaná statistika
|
||||
|
||||
**Po:**
|
||||
```
|
||||
✓ Neomezený počet UrNetwork účtů
|
||||
✓ Kombinovaná statistika ze všech účtů
|
||||
✓ Individuální grafy pro každý účet
|
||||
✓ Snadné přepínání mezi účty
|
||||
✓ Přezdívky pro lepší orientaci
|
||||
✓ Zapínání/vypínání sledování
|
||||
```
|
||||
|
||||
### 2. Redesign UI 🎨 VYLEPŠENO
|
||||
|
||||
**Design změny:**
|
||||
```css
|
||||
Před: Flat dark theme
|
||||
Po: Glassmorphism + Gradients
|
||||
|
||||
Barvy:
|
||||
Před: Modrá (#3b82f6)
|
||||
Po: Fialová gradient (#667eea → #764ba2)
|
||||
|
||||
Efekty:
|
||||
✓ Blur backdrop filters
|
||||
✓ Smooth hover animations
|
||||
✓ Shadow depth effects
|
||||
✓ Gradient overlays
|
||||
✓ Animated transitions
|
||||
```
|
||||
|
||||
### 3. Lepší Bezpečnost 🔐 VYLEPŠENO
|
||||
|
||||
**Před:**
|
||||
```
|
||||
- Přihlášení pomocí UrNetwork credentials
|
||||
- Hesla v .env otevřeně
|
||||
```
|
||||
|
||||
**Po:**
|
||||
```
|
||||
✓ Oddělené admin heslo pro dashboard
|
||||
✓ UrNetwork credentials bezpečně v databázi
|
||||
✓ Session management
|
||||
✓ HTTPS redirect podpora
|
||||
```
|
||||
|
||||
### 4. Vylepšené Grafy 📊 ROZŠÍŘENO
|
||||
|
||||
**Nové možnosti:**
|
||||
- Kombinovaný graf (všechny účty dohromady)
|
||||
- Individuální grafy pro každý účet
|
||||
- Barevné odlišení účtů
|
||||
- Přepínání mezi pohledy
|
||||
- Lepší legenda a tooltips
|
||||
|
||||
### 5. Správa Zařízení 📱 ROZŠÍŘENO
|
||||
|
||||
**Před:**
|
||||
```
|
||||
Device Name | Status | Client ID | Mode | Remove
|
||||
```
|
||||
|
||||
**Po:**
|
||||
```
|
||||
Account | Device Name | Status | Client ID | Mode | Remove
|
||||
↓
|
||||
Označení které zařízení patří kterému účtu
|
||||
```
|
||||
|
||||
## 📊 Srovnání Funkcí
|
||||
|
||||
| Funkce | v1.0 | v2.0 |
|
||||
|--------|------|------|
|
||||
| Počet účtů | 1 | Neomezeno |
|
||||
| Design | Basic Dark | Glassmorphism |
|
||||
| Grafy | Základní | Multi-account + Combined |
|
||||
| Admin panel | UrNetwork login | Oddělené admin heslo |
|
||||
| Webhooky | Základní | S account proměnnou |
|
||||
| Správa účtů | Manuálně v .env | GUI správa |
|
||||
| Toggle účtů | ❌ | ✅ |
|
||||
| Přezdívky | ❌ | ✅ |
|
||||
| Barevné odlišení | ❌ | ✅ |
|
||||
| Kombinované stats | ❌ | ✅ |
|
||||
|
||||
## 🚀 Upgrade Proces
|
||||
|
||||
### Krok 1: Příprava
|
||||
```bash
|
||||
# 1. Zastavte běžící aplikaci
|
||||
pkill -f main.py
|
||||
|
||||
# 2. Přejděte do složky aplikace
|
||||
cd ~/urio
|
||||
|
||||
# 3. Stáhněte nové soubory
|
||||
# (nebo je nahrajte manuálně)
|
||||
```
|
||||
|
||||
### Krok 2: Migrace
|
||||
```bash
|
||||
# Spusťte migrační skript
|
||||
python3 migrate.py
|
||||
```
|
||||
|
||||
**Migrační skript automaticky:**
|
||||
1. ✓ Vytvoří zálohy (.env.backup, transfer_stats.db.backup)
|
||||
2. ✓ Aktualizuje strukturu databáze
|
||||
3. ✓ Přidá tabulku accounts
|
||||
4. ✓ Migruje existující účet
|
||||
5. ✓ Nastaví admin heslo
|
||||
6. ✓ Ověří migraci
|
||||
|
||||
### Krok 3: Test
|
||||
```bash
|
||||
# Spusťte novou verzi
|
||||
python3 main.py
|
||||
|
||||
# Otevřete v prohlížeči
|
||||
http://your-server:90
|
||||
|
||||
# Přihlaste se pomocím NOVÉHO admin hesla
|
||||
```
|
||||
|
||||
### Krok 4: Přidání účtů
|
||||
```
|
||||
1. Přihlaste se do dashboardu
|
||||
2. Menu → Správa účtů
|
||||
3. Klikněte "Přidat účet"
|
||||
4. Vyplňte:
|
||||
- UrNetwork email
|
||||
- UrNetwork heslo
|
||||
- Přezdívku (např. "Domácí", "Práce")
|
||||
5. Účet se automaticky ověří
|
||||
```
|
||||
|
||||
## 🔄 Rollback (pokud něco nejde)
|
||||
|
||||
### Obnovení zálohy
|
||||
```bash
|
||||
# Zastavte aplikaci
|
||||
pkill -f main.py
|
||||
|
||||
# Obnovte zálohy
|
||||
cp .env.backup .env
|
||||
cp transfer_stats.db.backup transfer_stats.db
|
||||
mv main.py.old main.py
|
||||
|
||||
# Spusťte starou verzi
|
||||
python3 main.py
|
||||
```
|
||||
|
||||
## 📱 Použití Multi-Account
|
||||
|
||||
### Přidání druhého účtu
|
||||
```
|
||||
Příklad: Máte 2 UrNetwork účty
|
||||
|
||||
Účet 1 (Existující):
|
||||
Email: vlastik.novotny2005@gmail.com
|
||||
→ Automaticky migrován
|
||||
→ Přezdívka: "Hlavní účet"
|
||||
|
||||
Účet 2 (Nový):
|
||||
Email: druhy.ucet@gmail.com
|
||||
Heslo: ********
|
||||
→ Přidán přes GUI
|
||||
→ Přezdívka: "Pracovní účet"
|
||||
```
|
||||
|
||||
### Zobrazení kombinovaných dat
|
||||
```
|
||||
Veřejný dashboard:
|
||||
→ Zobrazí součet dat obou účtů
|
||||
→ Individual grafy pro každý účet
|
||||
→ Celkové výdělky ze všech účtů
|
||||
|
||||
Privátní dashboard:
|
||||
→ Toggle: "Kombinovaná statistika" / "Jednotlivé účty"
|
||||
→ Filtr podle účtu v sekci Account & Leaderboard
|
||||
→ Zařízení označená účtem
|
||||
```
|
||||
|
||||
## 🎨 CSS Customizace
|
||||
|
||||
### Změna barevného schématu
|
||||
V `main_enhanced.py`, změňte CSS proměnné:
|
||||
|
||||
```css
|
||||
:root {
|
||||
/* Změňte tyto hodnoty pro vlastní barevné schéma */
|
||||
--primary: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
--success: #10b981;
|
||||
--danger: #ef4444;
|
||||
}
|
||||
```
|
||||
|
||||
### Populární barevné schémata:
|
||||
|
||||
**Modrá (Ocean):**
|
||||
```css
|
||||
--primary: linear-gradient(135deg, #667eea 0%, #00d4ff 100%);
|
||||
```
|
||||
|
||||
**Zelená (Nature):**
|
||||
```css
|
||||
--primary: linear-gradient(135deg, #11998e 0%, #38ef7d 100%);
|
||||
```
|
||||
|
||||
**Oranžová (Sunset):**
|
||||
```css
|
||||
--primary: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
|
||||
```
|
||||
|
||||
## 🐛 Časté Problémy
|
||||
|
||||
### Problém: "Nelze se přihlásit"
|
||||
**Řešení:**
|
||||
```bash
|
||||
# Zkontrolujte ADMIN_PASSWORD v .env
|
||||
cat .env | grep ADMIN_PASSWORD
|
||||
|
||||
# Pokud chybí, přidejte ho
|
||||
echo "ADMIN_PASSWORD=your_password" >> .env
|
||||
```
|
||||
|
||||
### Problém: "Účet se nepřidává"
|
||||
**Řešení:**
|
||||
1. Zkontrolujte UrNetwork credentials
|
||||
2. Zkuste se přihlásit na bringyour.com
|
||||
3. Zkontrolujte logy: `tail -f nohup.out`
|
||||
|
||||
### Problém: "Chybí data po migraci"
|
||||
**Řešení:**
|
||||
```bash
|
||||
# Ověřte account_id ve stats tabulce
|
||||
sqlite3 transfer_stats.db "SELECT COUNT(*) FROM stats WHERE account_id IS NULL;"
|
||||
|
||||
# Pokud je > 0, přiřaďte manuálně
|
||||
sqlite3 transfer_stats.db "UPDATE stats SET account_id = 1 WHERE account_id IS NULL;"
|
||||
```
|
||||
|
||||
### Problém: "Webhook nefunguje"
|
||||
**Řešení:**
|
||||
```
|
||||
Starý formát:
|
||||
{"content": "Data: ${total_gb} GB"}
|
||||
|
||||
Nový formát:
|
||||
{"content": "Account: ${account}, Data: ${total_gb} GB"}
|
||||
^^^^^^^^^^^
|
||||
Nová proměnná
|
||||
```
|
||||
|
||||
## 📈 Performance Tips
|
||||
|
||||
### Pro více než 5 účtů:
|
||||
```python
|
||||
# V main_enhanced.py, upravte job interval
|
||||
@scheduler.task(id="log_stats_job", trigger="cron", minute="0,30")
|
||||
# místo: minute="0,15,30,45"
|
||||
# Tím snížíte frekvenci API callů
|
||||
```
|
||||
|
||||
### Pro lepší responzivitu:
|
||||
```bash
|
||||
# Použijte Gunicorn místo development serveru
|
||||
pip install gunicorn
|
||||
gunicorn -w 4 -b 0.0.0.0:90 main_enhanced:app
|
||||
```
|
||||
|
||||
## 🎯 Co Dělat Dál
|
||||
|
||||
1. **Přidejte další účty**
|
||||
- Menu → Správa účtů → Přidat účet
|
||||
|
||||
2. **Nastavte webhooky**
|
||||
- Menu → Nastavení → Webhook Management
|
||||
- Použijte `${account}` pro rozlišení účtů
|
||||
|
||||
3. **Customizujte design**
|
||||
- Změňte CSS proměnné podle svých preferencí
|
||||
|
||||
4. **Monitoring**
|
||||
- Zkontrolujte logy pravidelně
|
||||
- Nastavte alerting přes webhooky
|
||||
|
||||
## 📞 Podpora
|
||||
|
||||
- **GitHub Issues**: Pro bug reporty a feature requesty
|
||||
- **Documentation**: README_CZ.md pro detailní dokumentaci
|
||||
- **Migration Help**: migrate.py --help pro nápovědu
|
||||
|
||||
---
|
||||
|
||||
**Enjoy your new multi-account dashboard! 🚀**
|
||||
391
WEBHOOK_GUIDE.md
Normal file
391
WEBHOOK_GUIDE.md
Normal file
|
|
@ -0,0 +1,391 @@
|
|||
# 🔔 Webhook Průvodce - UrNetwork Stats Dashboard
|
||||
|
||||
## 📋 Dostupné Proměnné
|
||||
|
||||
Když webhook systém posílá notifikace, máš k dispozici tyto proměnné:
|
||||
|
||||
| Proměnná | Popis | Příklad | Formát |
|
||||
|----------|-------|---------|--------|
|
||||
| `${account}` | Přezdívka účtu | "Hlavní účet" | Text |
|
||||
| `${paid_gb}` | Placená data v GB | "123.456" | 3 des. místa |
|
||||
| `${unpaid_gb}` | Neplacená data v GB | "45.678" | 3 des. místa |
|
||||
| `${total_gb}` | Celková data v GB | "169.134" | 3 des. místa |
|
||||
| `${update_time}` | Čas aktualizace | "2024-11-21 12:30:45" | YYYY-MM-DD HH:MM:SS |
|
||||
|
||||
## 🎯 Kdy Se Webhooky Spouštějí?
|
||||
|
||||
- **Každých 15 minut** - Když scheduler načte nová data
|
||||
- **Pro každý aktivní účet** zvlášť
|
||||
- Pouze pokud se načtení dat povede
|
||||
|
||||
---
|
||||
|
||||
## 🔥 Příklady Pro Tebe (Vlastík)
|
||||
|
||||
### 1. Discord - Jednoduchá Notifikace 💬
|
||||
|
||||
```json
|
||||
{
|
||||
"content": "📊 **${account}** aktualizace!\n💾 Celkem: **${total_gb} GB**\n💰 Placená: ${paid_gb} GB | 📡 Neplacená: ${unpaid_gb} GB\n🕐 ${update_time}"
|
||||
}
|
||||
```
|
||||
|
||||
**Výstup:**
|
||||
```
|
||||
📊 **Hlavní účet** aktualizace!
|
||||
💾 Celkem: **169.134 GB**
|
||||
💰 Placená: 123.456 GB | 📡 Neplacená: 45.678 GB
|
||||
🕐 2024-11-21 12:30:45
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. Discord - Bohatý Embed (Český) 🇨🇿
|
||||
|
||||
```json
|
||||
{
|
||||
"embeds": [{
|
||||
"title": "📊 UrNetwork - ${account}",
|
||||
"description": "Nová data byla načtena!",
|
||||
"color": 3901635,
|
||||
"fields": [
|
||||
{
|
||||
"name": "💰 Placená Data",
|
||||
"value": "${paid_gb} GB",
|
||||
"inline": true
|
||||
},
|
||||
{
|
||||
"name": "📡 Neplacená Data",
|
||||
"value": "${unpaid_gb} GB",
|
||||
"inline": true
|
||||
},
|
||||
{
|
||||
"name": "💾 Celkem Poskytnutých Dat",
|
||||
"value": "**${total_gb} GB**",
|
||||
"inline": false
|
||||
}
|
||||
],
|
||||
"footer": {
|
||||
"text": "Aktualizováno"
|
||||
},
|
||||
"timestamp": "${update_time}"
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. Discord - Minimalistický 🎯
|
||||
|
||||
```json
|
||||
{
|
||||
"content": "⚡ ${account}: **${total_gb} GB** (${paid_gb} / ${unpaid_gb})"
|
||||
}
|
||||
```
|
||||
|
||||
**Výstup:**
|
||||
```
|
||||
⚡ Hlavní účet: **169.134 GB** (123.456 / 45.678)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. Discord - S Progress Barem 📊
|
||||
|
||||
```json
|
||||
{
|
||||
"embeds": [{
|
||||
"title": "⚡ ${account} Stats",
|
||||
"color": 3447003,
|
||||
"description": "**Celkem: ${total_gb} GB**\n\n💰 Placená: `${paid_gb} GB`\n📡 Neplacená: `${unpaid_gb} GB`",
|
||||
"footer": {
|
||||
"text": "${update_time}"
|
||||
}
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5. Slack - Jednoduchá Zpráva 💼
|
||||
|
||||
```json
|
||||
{
|
||||
"text": ":bar_chart: *${account}* - Aktualizace\nCelkem: *${total_gb} GB* | Placená: ${paid_gb} GB | Neplacená: ${unpaid_gb} GB\n_${update_time}_"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 6. Slack - Formátovaná Zpráva 💼
|
||||
|
||||
```json
|
||||
{
|
||||
"blocks": [
|
||||
{
|
||||
"type": "header",
|
||||
"text": {
|
||||
"type": "plain_text",
|
||||
"text": "📊 UrNetwork Stats - ${account}"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"fields": [
|
||||
{
|
||||
"type": "mrkdwn",
|
||||
"text": "*Placená Data:*\n${paid_gb} GB"
|
||||
},
|
||||
{
|
||||
"type": "mrkdwn",
|
||||
"text": "*Neplacená Data:*\n${unpaid_gb} GB"
|
||||
},
|
||||
{
|
||||
"type": "mrkdwn",
|
||||
"text": "*Celkem:*\n${total_gb} GB"
|
||||
},
|
||||
{
|
||||
"type": "mrkdwn",
|
||||
"text": "*Čas:*\n${update_time}"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 7. Telegram - Markdown 📱
|
||||
|
||||
```json
|
||||
{
|
||||
"chat_id": "YOUR_CHAT_ID",
|
||||
"text": "📊 *${account}* - Aktualizace\n\n💾 *Celkem:* ${total_gb} GB\n💰 Placená: ${paid_gb} GB\n📡 Neplacená: ${unpaid_gb} GB\n\n🕐 _${update_time}_",
|
||||
"parse_mode": "Markdown"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 8. MS Teams - Jednoduchá Karta 🏢
|
||||
|
||||
```json
|
||||
{
|
||||
"@type": "MessageCard",
|
||||
"@context": "https://schema.org/extensions",
|
||||
"summary": "${account} Stats Update",
|
||||
"themeColor": "0078D7",
|
||||
"title": "📊 ${account} - UrNetwork Stats",
|
||||
"sections": [{
|
||||
"facts": [
|
||||
{
|
||||
"name": "Placená Data:",
|
||||
"value": "${paid_gb} GB"
|
||||
},
|
||||
{
|
||||
"name": "Neplacená Data:",
|
||||
"value": "${unpaid_gb} GB"
|
||||
},
|
||||
{
|
||||
"name": "Celkem:",
|
||||
"value": "${total_gb} GB"
|
||||
}
|
||||
],
|
||||
"text": "Aktualizováno: ${update_time}"
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 9. Generic JSON (pro vlastní API) 🔧
|
||||
|
||||
```json
|
||||
{
|
||||
"event": "urnetwork_update",
|
||||
"account_name": "${account}",
|
||||
"data": {
|
||||
"paid_gb": "${paid_gb}",
|
||||
"unpaid_gb": "${unpaid_gb}",
|
||||
"total_gb": "${total_gb}"
|
||||
},
|
||||
"timestamp": "${update_time}"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 10. IFTTT Webhook 🔗
|
||||
|
||||
```json
|
||||
{
|
||||
"value1": "${account}",
|
||||
"value2": "${total_gb} GB",
|
||||
"value3": "Placená: ${paid_gb} GB, Neplacená: ${unpaid_gb} GB"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Doporučené Pro Tebe
|
||||
|
||||
Protože máš UrNetwork setup a pravděpodobně používáš Discord/Telegram, doporučuji:
|
||||
|
||||
### ⭐ Nejlepší Volba - Discord Embed (Český)
|
||||
|
||||
```json
|
||||
{
|
||||
"username": "UrNetwork Bot",
|
||||
"avatar_url": "https://cdn-icons-png.flaticon.com/512/2920/2920277.png",
|
||||
"embeds": [{
|
||||
"title": "⚡ ${account} - Nová Data!",
|
||||
"color": 3901635,
|
||||
"fields": [
|
||||
{
|
||||
"name": "💰 Placená Data",
|
||||
"value": "`${paid_gb} GB`",
|
||||
"inline": true
|
||||
},
|
||||
{
|
||||
"name": "📡 Neplacená Data",
|
||||
"value": "`${unpaid_gb} GB`",
|
||||
"inline": true
|
||||
},
|
||||
{
|
||||
"name": "💾 Celkem",
|
||||
"value": "**${total_gb} GB**",
|
||||
"inline": false
|
||||
}
|
||||
],
|
||||
"footer": {
|
||||
"text": "UrNetwork Stats Dashboard"
|
||||
},
|
||||
"timestamp": "${update_time}"
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
### 🚀 Rychlá Varianta - Pro Mobil
|
||||
|
||||
```json
|
||||
{
|
||||
"content": "⚡ **${account}**: ${total_gb} GB\n💰 ${paid_gb} | 📡 ${unpaid_gb}"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Jak Přidat Webhook
|
||||
|
||||
### 1. Discord Webhook URL
|
||||
```
|
||||
1. Jdi do Discord serveru
|
||||
2. Server Settings → Integrations → Webhooks
|
||||
3. New Webhook
|
||||
4. Zkopíruj Webhook URL
|
||||
5. Vlož do dashboardu v Settings → Webhook Management
|
||||
```
|
||||
|
||||
### 2. V Dashboardu
|
||||
```
|
||||
1. Přihlaš se do dashboardu
|
||||
2. Menu → Settings (Nastavení)
|
||||
3. Webhook Management
|
||||
4. Vlož URL: https://discord.com/api/webhooks/...
|
||||
5. Vlož JSON payload (výše)
|
||||
6. Přidat Webhook
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Test Webhooku
|
||||
|
||||
Chceš otestovat, jestli webhook funguje? Spusť manuální fetch:
|
||||
|
||||
```bash
|
||||
# V dashboardu klikni "Fetch Now"
|
||||
# nebo z příkazové řádky:
|
||||
curl -X POST http://localhost:90/trigger
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Debug
|
||||
|
||||
### Pokud webhook nefunguje:
|
||||
|
||||
1. **Zkontroluj logy:**
|
||||
```bash
|
||||
tail -f nohup.out | grep webhook
|
||||
```
|
||||
|
||||
2. **Zkontroluj JSON syntax:**
|
||||
```bash
|
||||
# Použij online JSON validator
|
||||
# https://jsonlint.com/
|
||||
```
|
||||
|
||||
3. **Test Discord webhooku:**
|
||||
```bash
|
||||
curl -X POST "YOUR_WEBHOOK_URL" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"content": "Test message"}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💡 Pro Tipy
|
||||
|
||||
### Více Webhooků
|
||||
Můžeš přidat více webhooků - každý dostane notifikaci!
|
||||
- Discord server 1
|
||||
- Discord server 2
|
||||
- Slack workspace
|
||||
- Telegram bot
|
||||
|
||||
### Filtrování Podle Účtu
|
||||
Chceš notifikace jen pro specifický účet?
|
||||
|
||||
V payloadu použij podmínku (pokud tvůj webhook systém podporuje):
|
||||
```json
|
||||
{
|
||||
"content": "${account} update: ${total_gb} GB"
|
||||
}
|
||||
```
|
||||
|
||||
A vytvoř samostatný webhook jen když je `${account}` = "Hlavní účet"
|
||||
|
||||
### Rate Limiting
|
||||
Pozor! Většina služeb má rate limit:
|
||||
- Discord: 5 zpráv / 2 sekundy per webhook
|
||||
- Slack: 1 zpráva / sekunda
|
||||
|
||||
Dashboard posílá notifikace každých 15 minut, takže jsi v pohodě! ✅
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Tvoje Setup (Doporučení)
|
||||
|
||||
Protože máš pravděpodobně několik účtů, doporučuji:
|
||||
|
||||
```json
|
||||
{
|
||||
"embeds": [{
|
||||
"title": "📊 ${account}",
|
||||
"description": "**${total_gb} GB** poskytnutých dat",
|
||||
"color": 3901635,
|
||||
"fields": [
|
||||
{"name": "💰 Placená", "value": "${paid_gb} GB", "inline": true},
|
||||
{"name": "📡 Neplacená", "value": "${unpaid_gb} GB", "inline": true}
|
||||
],
|
||||
"footer": {"text": "${update_time}"}
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
Takto dostaneš **jednu zprávu každých 15 minut pro každý účet** s přehledným rozdělením! 🎉
|
||||
|
||||
---
|
||||
|
||||
**Potřebuješ pomoct s nastavením? Dej vědět! 🚀**
|
||||
94
fix_db_path.py
Normal file
94
fix_db_path.py
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Quick fix script for database path issue
|
||||
Fixes the main.py file to use absolute paths
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
def fix_main_py():
|
||||
"""Fix main.py to use absolute database path"""
|
||||
|
||||
main_file = 'main.py'
|
||||
|
||||
if not os.path.exists(main_file):
|
||||
print("❌ main.py not found in current directory")
|
||||
print(" Run this script from the urio folder")
|
||||
sys.exit(1)
|
||||
|
||||
print("🔧 Fixing database path in main.py...")
|
||||
|
||||
# Read the file
|
||||
with open(main_file, 'r') as f:
|
||||
content = f.read()
|
||||
|
||||
# Check if already fixed
|
||||
if 'BASE_DIR = os.path.abspath(os.path.dirname(__file__))' in content:
|
||||
print("✅ main.py is already fixed!")
|
||||
return
|
||||
|
||||
# Fix 1: Update Config class
|
||||
old_config = '''class Config:
|
||||
"""Flask configuration."""
|
||||
SCHEDULER_API_ENABLED = True
|
||||
SQLALCHEMY_DATABASE_URI = os.getenv("DATABASE_URL", "sqlite:///instance/transfer_stats.db")'''
|
||||
|
||||
new_config = '''class Config:
|
||||
"""Flask configuration."""
|
||||
SCHEDULER_API_ENABLED = True
|
||||
# Use absolute path for database
|
||||
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
|
||||
INSTANCE_DIR = os.path.join(BASE_DIR, 'instance')
|
||||
SQLALCHEMY_DATABASE_URI = os.getenv("DATABASE_URL", f"sqlite:///{os.path.join(INSTANCE_DIR, 'transfer_stats.db')}")'''
|
||||
|
||||
if old_config in content:
|
||||
content = content.replace(old_config, new_config)
|
||||
print("✅ Updated Config class with absolute paths")
|
||||
|
||||
# Fix 2: Ensure instance folder creation happens before app init
|
||||
old_init = '''# --- Flask App Initialization ---
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config.from_object(Config)
|
||||
|
||||
# Ensure instance folder exists
|
||||
instance_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'instance')
|
||||
if not os.path.exists(instance_path):
|
||||
os.makedirs(instance_path)'''
|
||||
|
||||
new_init = '''# --- Flask App Initialization ---
|
||||
|
||||
# Ensure instance folder exists BEFORE creating the app
|
||||
instance_path = Config.INSTANCE_DIR
|
||||
if not os.path.exists(instance_path):
|
||||
os.makedirs(instance_path)
|
||||
logging.info(f"Created instance directory: {instance_path}")
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config.from_object(Config)'''
|
||||
|
||||
if old_init in content:
|
||||
content = content.replace(old_init, new_init)
|
||||
print("✅ Updated instance folder creation")
|
||||
|
||||
# Write the fixed content
|
||||
with open(main_file, 'w') as f:
|
||||
f.write(content)
|
||||
|
||||
print("\n✅ main.py has been fixed!")
|
||||
print("\nYou can now run:")
|
||||
print(" python3 main.py")
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("""
|
||||
╔════════════════════════════════════════════════════════════╗
|
||||
║ UrNetwork Stats Dashboard - Database Path Fix ║
|
||||
╚════════════════════════════════════════════════════════════╝
|
||||
""")
|
||||
|
||||
try:
|
||||
fix_main_py()
|
||||
except Exception as e:
|
||||
print(f"\n❌ Error: {e}")
|
||||
sys.exit(1)
|
||||
102
install.sh
Normal file
102
install.sh
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
#!/bin/bash
|
||||
|
||||
# UrNetwork Stats Dashboard - Installation Script v2.1
|
||||
# This script automates the installation process
|
||||
|
||||
set -e # Exit on error
|
||||
|
||||
echo "========================================="
|
||||
echo "UrNetwork Stats Dashboard v2.1"
|
||||
echo "Installation Script"
|
||||
echo "========================================="
|
||||
echo ""
|
||||
|
||||
# Check Python version
|
||||
echo "[1/6] Checking Python version..."
|
||||
if ! command -v python3 &> /dev/null; then
|
||||
echo "❌ Python 3 is not installed!"
|
||||
echo "Please install Python 3.8+ and try again."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PYTHON_VERSION=$(python3 -c 'import sys; print(".".join(map(str, sys.version_info[:2])))')
|
||||
echo "✅ Python $PYTHON_VERSION found"
|
||||
echo ""
|
||||
|
||||
# Check pip
|
||||
echo "[2/6] Checking pip..."
|
||||
if ! command -v pip3 &> /dev/null; then
|
||||
echo "❌ pip3 is not installed!"
|
||||
echo "Please install pip3 and try again."
|
||||
exit 1
|
||||
fi
|
||||
echo "✅ pip3 found"
|
||||
echo ""
|
||||
|
||||
# Install dependencies
|
||||
echo "[3/6] Installing dependencies..."
|
||||
echo "This may take a few minutes..."
|
||||
pip3 install -r requirements.txt
|
||||
echo "✅ Dependencies installed"
|
||||
echo ""
|
||||
|
||||
# Create necessary directories
|
||||
echo "[4/6] Creating directories..."
|
||||
mkdir -p instance
|
||||
echo "✅ Directories created"
|
||||
echo ""
|
||||
|
||||
# Check if already installed
|
||||
echo "[5/6] Checking existing installation..."
|
||||
if [ -f ".env" ]; then
|
||||
echo "⚠️ Found existing .env file"
|
||||
read -p "Do you want to keep it? (y/n): " keep_env
|
||||
if [ "$keep_env" != "y" ]; then
|
||||
mv .env .env.backup
|
||||
echo "✅ Backed up to .env.backup"
|
||||
else
|
||||
echo "✅ Keeping existing configuration"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -f "instance/transfer_stats.db" ]; then
|
||||
echo "⚠️ Found existing database"
|
||||
read -p "Do you want to keep it? (y/n): " keep_db
|
||||
if [ "$keep_db" != "y" ]; then
|
||||
mv instance/transfer_stats.db instance/transfer_stats.db.backup
|
||||
echo "✅ Backed up to transfer_stats.db.backup"
|
||||
else
|
||||
echo "✅ Keeping existing database"
|
||||
fi
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Final instructions
|
||||
echo "[6/6] Installation complete!"
|
||||
echo ""
|
||||
echo "========================================="
|
||||
echo "🎉 Ready to start!"
|
||||
echo "========================================="
|
||||
echo ""
|
||||
echo "To run the dashboard:"
|
||||
echo " python3 main.py"
|
||||
echo ""
|
||||
echo "Then open your browser to:"
|
||||
echo " http://localhost:90"
|
||||
echo ""
|
||||
echo "On first run, you will:"
|
||||
echo " 1. Set your admin password"
|
||||
echo " 2. Add your UrNetwork accounts"
|
||||
echo ""
|
||||
echo "For production deployment with Gunicorn:"
|
||||
echo " gunicorn --bind 0.0.0.0:90 --workers 4 main:app"
|
||||
echo ""
|
||||
echo "For systemd service setup, see README.md"
|
||||
echo ""
|
||||
echo "📖 Documentation:"
|
||||
echo " - README.md - Full documentation"
|
||||
echo " - QUICKSTART.md - Quick start guide"
|
||||
echo " - WEBHOOK_GUIDE.md - Webhook examples"
|
||||
echo ""
|
||||
echo "Need help? Check the docs or create an issue!"
|
||||
echo "========================================="
|
||||
2221
main_clean.py
Normal file
2221
main_clean.py
Normal file
File diff suppressed because it is too large
Load diff
2149
main_enhanced.py
Normal file
2149
main_enhanced.py
Normal file
File diff suppressed because it is too large
Load diff
315
migrate.py
Normal file
315
migrate.py
Normal file
|
|
@ -0,0 +1,315 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Database Migration Script for UrNetwork Stats Dashboard v2.0
|
||||
Migrates from single-account to multi-account structure
|
||||
"""
|
||||
|
||||
import sqlite3
|
||||
import os
|
||||
import sys
|
||||
from getpass import getpass
|
||||
|
||||
def print_header(text):
|
||||
print("\n" + "=" * 60)
|
||||
print(f" {text}")
|
||||
print("=" * 60)
|
||||
|
||||
def print_success(text):
|
||||
print(f"✓ {text}")
|
||||
|
||||
def print_warning(text):
|
||||
print(f"⚠ {text}")
|
||||
|
||||
def print_error(text):
|
||||
print(f"✗ {text}")
|
||||
|
||||
def backup_files():
|
||||
"""Create backups of existing files"""
|
||||
print_header("Vytváření záloh")
|
||||
|
||||
if os.path.exists('.env'):
|
||||
os.system('cp .env .env.backup')
|
||||
print_success("Zazálohován .env → .env.backup")
|
||||
|
||||
# Check for database in multiple locations
|
||||
db_locations = ['transfer_stats.db', 'instance/transfer_stats.db']
|
||||
for db_path in db_locations:
|
||||
if os.path.exists(db_path):
|
||||
backup_path = db_path + '.backup'
|
||||
os.system(f'cp {db_path} {backup_path}')
|
||||
print_success(f"Zazálohována databáze → {backup_path}")
|
||||
break
|
||||
|
||||
def migrate_database():
|
||||
"""Migrate database to new structure"""
|
||||
print_header("Migrace databáze")
|
||||
|
||||
# Check for database in multiple locations
|
||||
db_path = None
|
||||
possible_paths = [
|
||||
'transfer_stats.db',
|
||||
'instance/transfer_stats.db',
|
||||
'../transfer_stats.db'
|
||||
]
|
||||
|
||||
for path in possible_paths:
|
||||
if os.path.exists(path):
|
||||
db_path = path
|
||||
print_success(f"Nalezena databáze: {db_path}")
|
||||
break
|
||||
|
||||
if not db_path:
|
||||
print_error("Databáze transfer_stats.db nenalezena!")
|
||||
print_warning("Hledáno v: " + ", ".join(possible_paths))
|
||||
return False
|
||||
|
||||
try:
|
||||
conn = sqlite3.connect(db_path)
|
||||
cursor = conn.cursor()
|
||||
|
||||
# 1. Create accounts table
|
||||
cursor.execute('''
|
||||
CREATE TABLE IF NOT EXISTS accounts (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
username TEXT UNIQUE NOT NULL,
|
||||
password TEXT NOT NULL,
|
||||
nickname TEXT,
|
||||
is_active BOOLEAN DEFAULT 1,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
)
|
||||
''')
|
||||
print_success("Vytvořena tabulka accounts")
|
||||
|
||||
# 2. Add account_id column to stats
|
||||
try:
|
||||
cursor.execute('ALTER TABLE stats ADD COLUMN account_id INTEGER')
|
||||
print_success("Přidán sloupec account_id do tabulky stats")
|
||||
except sqlite3.OperationalError as e:
|
||||
if "duplicate column" in str(e).lower():
|
||||
print_warning("Sloupec account_id již existuje")
|
||||
else:
|
||||
raise
|
||||
|
||||
# 3. Migrate existing account from .env
|
||||
if os.path.exists('.env'):
|
||||
username = None
|
||||
password = None
|
||||
|
||||
with open('.env', 'r') as f:
|
||||
for line in f:
|
||||
if line.startswith('UR_USER='):
|
||||
username = line.split('=', 1)[1].strip()
|
||||
elif line.startswith('UR_PASS='):
|
||||
password = line.split('=', 1)[1].strip()
|
||||
|
||||
if username and password:
|
||||
cursor.execute('SELECT COUNT(*) FROM accounts WHERE username = ?', (username,))
|
||||
|
||||
if cursor.fetchone()[0] == 0:
|
||||
print(f"\nNalezen existující účet: {username}")
|
||||
nickname = input("Zadejte přezdívku pro tento účet (nebo stiskněte Enter pro přeskočení): ").strip()
|
||||
|
||||
cursor.execute(
|
||||
'INSERT INTO accounts (username, password, nickname, is_active) VALUES (?, ?, ?, 1)',
|
||||
(username, password, nickname if nickname else None)
|
||||
)
|
||||
account_id = cursor.lastrowid
|
||||
|
||||
# Update existing stats
|
||||
cursor.execute('UPDATE stats SET account_id = ? WHERE account_id IS NULL', (account_id,))
|
||||
updated_count = cursor.rowcount
|
||||
|
||||
print_success(f"Migrován účet: {username}")
|
||||
if nickname:
|
||||
print_success(f" Přezdívka: {nickname}")
|
||||
print_success(f" Aktualizováno {updated_count} statistických záznamů")
|
||||
else:
|
||||
print_warning(f"Účet {username} již existuje v databázi")
|
||||
else:
|
||||
print_warning("Nenalezeny credentials v .env souboru")
|
||||
else:
|
||||
print_warning(".env soubor nenalezen")
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
print_success("Migrace databáze dokončena!")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print_error(f"Chyba při migraci databáze: {e}")
|
||||
return False
|
||||
|
||||
def update_env_file():
|
||||
"""Update .env file with admin password"""
|
||||
print_header("Aktualizace .env souboru")
|
||||
|
||||
if not os.path.exists('.env'):
|
||||
print_warning(".env soubor nenalezen, bude vytvořen nový")
|
||||
env_lines = []
|
||||
else:
|
||||
with open('.env', 'r') as f:
|
||||
env_lines = f.readlines()
|
||||
|
||||
# Check if ADMIN_PASSWORD exists
|
||||
has_admin_pass = any(line.startswith('ADMIN_PASSWORD=') for line in env_lines)
|
||||
|
||||
if has_admin_pass:
|
||||
print_warning("ADMIN_PASSWORD již existuje v .env")
|
||||
response = input("Chcete nastavit nové heslo? (y/n): ").lower()
|
||||
if response != 'y':
|
||||
return True
|
||||
|
||||
# Remove old password
|
||||
env_lines = [line for line in env_lines if not line.startswith('ADMIN_PASSWORD=')]
|
||||
|
||||
print("\nNastavte administrátorské heslo pro přístup do dashboardu.")
|
||||
print("(Toto je oddělené od vašich UrNetwork credentials)")
|
||||
|
||||
while True:
|
||||
admin_pass = getpass("\nAdministrátorské heslo: ")
|
||||
admin_pass_confirm = getpass("Potvrďte heslo: ")
|
||||
|
||||
if admin_pass == admin_pass_confirm:
|
||||
if len(admin_pass) < 6:
|
||||
print_error("Heslo musí mít alespoň 6 znaků!")
|
||||
continue
|
||||
break
|
||||
else:
|
||||
print_error("Hesla se neshodují!")
|
||||
|
||||
# Add admin password
|
||||
if not any(line.strip() == "# Admin Access" for line in env_lines):
|
||||
env_lines.insert(0, "# Admin Access\n")
|
||||
env_lines.insert(1, f"ADMIN_PASSWORD={admin_pass}\n")
|
||||
env_lines.insert(2, "\n")
|
||||
|
||||
# Write updated .env
|
||||
with open('.env', 'w') as f:
|
||||
f.writelines(env_lines)
|
||||
|
||||
print_success("Administrátorské heslo nastaveno")
|
||||
return True
|
||||
|
||||
def verify_migration():
|
||||
"""Verify that migration was successful"""
|
||||
print_header("Ověření migrace")
|
||||
|
||||
# Find database
|
||||
db_path = None
|
||||
for path in ['transfer_stats.db', 'instance/transfer_stats.db']:
|
||||
if os.path.exists(path):
|
||||
db_path = path
|
||||
break
|
||||
|
||||
if not db_path:
|
||||
print_error("Databáze nenalezena pro ověření")
|
||||
return False
|
||||
|
||||
try:
|
||||
conn = sqlite3.connect(db_path)
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Check accounts table
|
||||
cursor.execute("SELECT COUNT(*) FROM accounts")
|
||||
account_count = cursor.fetchone()[0]
|
||||
print_success(f"Nalezeno {account_count} účtů v databázi")
|
||||
|
||||
# Check stats with account_id
|
||||
cursor.execute("SELECT COUNT(*) FROM stats WHERE account_id IS NOT NULL")
|
||||
stats_count = cursor.fetchone()[0]
|
||||
print_success(f"Nalezeno {stats_count} statistických záznamů s account_id")
|
||||
|
||||
# Check orphaned stats
|
||||
cursor.execute("SELECT COUNT(*) FROM stats WHERE account_id IS NULL")
|
||||
orphaned_count = cursor.fetchone()[0]
|
||||
if orphaned_count > 0:
|
||||
print_warning(f"Nalezeno {orphaned_count} statistik bez přiřazeného účtu")
|
||||
|
||||
conn.close()
|
||||
|
||||
# Check .env
|
||||
if os.path.exists('.env'):
|
||||
with open('.env', 'r') as f:
|
||||
env_content = f.read()
|
||||
if 'ADMIN_PASSWORD=' in env_content:
|
||||
print_success("ADMIN_PASSWORD nalezeno v .env")
|
||||
else:
|
||||
print_warning("ADMIN_PASSWORD chybí v .env")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print_error(f"Chyba při ověření: {e}")
|
||||
return False
|
||||
|
||||
def print_next_steps():
|
||||
"""Print next steps after migration"""
|
||||
print_header("Další kroky")
|
||||
print("""
|
||||
1. Restartujte aplikaci:
|
||||
pkill -f main.py
|
||||
python3 main.py
|
||||
|
||||
2. Přihlaste se pomocí nového admin hesla
|
||||
|
||||
3. Přejděte do "Správa účtů" pro přidání dalších UrNetwork účtů
|
||||
|
||||
4. Pokud něco nefunguje, obnovte zálohy:
|
||||
cp .env.backup .env
|
||||
cp transfer_stats.db.backup transfer_stats.db
|
||||
|
||||
Dokumentace: README_CZ.md
|
||||
""")
|
||||
|
||||
def main():
|
||||
print("""
|
||||
╔════════════════════════════════════════════════════════════╗
|
||||
║ UrNetwork Stats Dashboard - Migration Script v2.0 ║
|
||||
║ Migrace z single-account na multi-account strukturu ║
|
||||
╚════════════════════════════════════════════════════════════╝
|
||||
""")
|
||||
|
||||
print("\nTento skript provede následující:")
|
||||
print(" • Vytvoří zálohy .env a databáze")
|
||||
print(" • Přidá podporu pro více účtů")
|
||||
print(" • Nastaví administrátorské heslo")
|
||||
print(" • Migruje existující data")
|
||||
|
||||
response = input("\nPokračovat? (y/n): ").lower()
|
||||
if response != 'y':
|
||||
print("Migrace zrušena.")
|
||||
sys.exit(0)
|
||||
|
||||
# Run migration steps
|
||||
backup_files()
|
||||
|
||||
if not migrate_database():
|
||||
print_error("\nMigrace selhala při aktualizaci databáze!")
|
||||
print("Obnovte zálohy a zkuste to znovu.")
|
||||
sys.exit(1)
|
||||
|
||||
if not update_env_file():
|
||||
print_error("\nMigrace selhala při aktualizaci .env!")
|
||||
print("Obnovte zálohy a zkuste to znovu.")
|
||||
sys.exit(1)
|
||||
|
||||
if not verify_migration():
|
||||
print_warning("\nOvěření migrace selhalo, ale data by měla být OK")
|
||||
|
||||
print_next_steps()
|
||||
|
||||
print_header("Migrace úspěšně dokončena! 🎉")
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
main()
|
||||
except KeyboardInterrupt:
|
||||
print("\n\nMigrace přerušena uživatelem.")
|
||||
sys.exit(1)
|
||||
except Exception as e:
|
||||
print_error(f"\nNeočekávaná chyba: {e}")
|
||||
print("Obnovte zálohy pomocí:")
|
||||
print(" cp .env.backup .env")
|
||||
print(" cp transfer_stats.db.backup transfer_stats.db")
|
||||
sys.exit(1)
|
||||
544
readme.md
544
readme.md
|
|
@ -1,275 +1,401 @@
|
|||
# UrNetwork Stats Dashboard - Refactored
|
||||
|
||||
# UrNetwork Stats Dashboard - Enhanced Multi-Account Edition v2.1
|
||||
|
||||
Hits - [demo](http://38.242.156.120:90) | [](https://hits.sh/38.242.156.120:90/)
|
||||
|
||||
Hits - [repo](https://forgejo.plainrock127.xyz/mxnticek/UrNetwork-Stats-Dashboard-remade) | [](https://hits.sh/forgejo.plainrock127.xyz/mxnticek/UrNetwork-Stats-Dashboard-remade/)
|
||||
|
||||
---
|
||||
|
||||
-----
|
||||
## 🌟 Quick Links
|
||||
|
||||
- 🚀 [Quick Start Guide](QUICKSTART.md) - Get running in 5 minutes
|
||||
- 📊 [Webhook Setup Tutorial](WEBHOOK_GUIDE.md) - Discord, Slack, Telegram examples
|
||||
- 🎨 [Design Comparison](DESIGN_COMPARISON.md) - Why this design?
|
||||
- 🔄 [Upgrade Guide](UPGRADE_GUIDE.md) - Migrating from v1.0
|
||||
- 📝 [Changelog](CHANGELOG.md) - Version history
|
||||
- 🇨🇿 [Český README](README_CZ.md) - Czech documentation
|
||||
|
||||
---
|
||||
|
||||
## 🇬🇧 English
|
||||
|
||||
### About The Project
|
||||
|
||||
This project is a significantly enhanced and refactored version of the original [UrNetwork Stats Dashboard](https://github.com/techroy23/UrNetwork-Stats-Dashboard). The application is designed to track, store, and visualize statistics about data transfers (both paid and unpaid) and earnings from your UrNetwork account.
|
||||
This is a **significantly enhanced multi-account version** of the original [UrNetwork Stats Dashboard](https://github.com/techroy23/UrNetwork-Stats-Dashboard). Track unlimited UrNetwork accounts with beautiful charts, real-time updates, and webhook notifications.
|
||||
|
||||
The entire application is packaged into a single `main_app.py` file for simplicity, yet it contains robust features including a web-based installer, authentication, public/private views, interactive charts, a provider map, and support for webhook notifications.
|
||||
**What's New in v2.1:**
|
||||
- 🎯 **Multi-Account Support** - Track unlimited UrNetwork accounts
|
||||
- 🎨 **Clean Design** - Cloudflare-inspired dark theme
|
||||
- 📊 **Better Charts** - White text, tooltips anywhere on chart
|
||||
- 🔐 **Separate Auth** - Admin password independent from UrNetwork
|
||||
- ⚡ **Daily Cleanup** - Auto-delete data older than 7 days
|
||||
- 📱 **Mobile Optimized** - Touch-friendly interface
|
||||
|
||||
> **A Note from the Author**
|
||||
>
|
||||
> I know I might get some hate for using AI to build and refactor this, but since I have access to it for free, I want to make the most of it. Plus, no offense to my friends who can code, but Gemini often explains concepts more clearly! (no hate)
|
||||
> (this readme is made by ai too.... please just dont hate me, im a stupid bitch-ass idiot that's almost braindead and im not even kidding.)
|
||||
> **Enhanced by AI:** v2.0+ developed with Claude (Anthropic) for better UX, multi-account support, and modern design.
|
||||
|
||||
-----
|
||||
---
|
||||
|
||||
### ✨ Features
|
||||
### ✨ Key Features
|
||||
|
||||
* **🐍 All-in-One Python Script:** The entire application logic, including the frontend, is contained within a single `main_app.py` file.
|
||||
* **🚀 Web-Based Installer:** A simple setup wizard guides you through configuring your UrNetwork API credentials on the first run.
|
||||
* **🔐 Dual Views (Public/Private):**
|
||||
* **Public Dashboard:** Displays summary stats, total data over time, and a world map of provider locations. Perfect for a quick overview.
|
||||
* **Private Dashboard:** After logging in, you get access to detailed charts, a complete history of data points, webhook management, and other administrative functions.
|
||||
* **📊 Interactive Charts:** Utilizes `Chart.js` for data visualization, including:
|
||||
* Total data provided over time.
|
||||
* Paid vs. Unpaid data comparison.
|
||||
* A bar chart showing data change between intervals.
|
||||
* **🗺️ Provider Map:** Displays the number of active providers by country on a world map using `Leaflet.js`.
|
||||
* **⚙️ Automated Data Collection:** A scheduler (`APScheduler`) automatically fetches and saves new data from the API every 15 minutes.
|
||||
* **🔔 Webhook Notifications:** Add your own webhook URLs (e.g., for Discord) to receive notifications with each new data sync.
|
||||
* **🎨 Modern UI:**
|
||||
* Styled with **Tailwind CSS**.
|
||||
* **Light/Dark/System theme** support.
|
||||
* Fully responsive design.
|
||||
* **💾 Persistent Storage:** Uses `SQLAlchemy` and a `SQLite` database to store historical data.
|
||||
#### 🎯 Multi-Account Management
|
||||
- ✅ Track unlimited UrNetwork accounts simultaneously
|
||||
- ✅ Combined statistics from all accounts
|
||||
- ✅ Individual charts for each account
|
||||
- ✅ Custom nicknames for easy identification
|
||||
- ✅ Toggle accounts on/off without deletion
|
||||
- ✅ Color-coded for easy distinction
|
||||
|
||||
-----
|
||||
#### 📊 Advanced Visualization
|
||||
- ✅ Interactive Chart.js charts with tooltips **anywhere on chart**
|
||||
- ✅ Total data, Paid vs Unpaid, Delta charts
|
||||
- ✅ White readable text on all charts (no more squinting!)
|
||||
- ✅ World map showing provider locations
|
||||
- ✅ Real-time updates every minute
|
||||
|
||||
### 🚀 Getting Started
|
||||
#### ⚙️ Automation
|
||||
- ✅ Data collection every 15 minutes
|
||||
- ✅ Daily cleanup (keeps last 7 days)
|
||||
- ✅ Webhook notifications (Discord, Slack, Telegram)
|
||||
- ✅ Device management across all accounts
|
||||
|
||||
#### Prerequisites
|
||||
#### 🎨 Modern UI
|
||||
- ✅ Clean Cloudflare-inspired dark theme
|
||||
- ✅ No gradients (better chart visibility)
|
||||
- ✅ Blue accent color (#3b82f6)
|
||||
- ✅ Fully responsive (mobile, tablet, desktop)
|
||||
- ✅ Czech & English support
|
||||
|
||||
* Python 3.x
|
||||
* Pip (Python package manager)
|
||||
---
|
||||
|
||||
#### Installation
|
||||
|
||||
1. **Clone the repository:**
|
||||
### 🚀 Quick Start
|
||||
|
||||
```bash
|
||||
git clone <YOUR_REPOSITORY_URL>
|
||||
cd <FOLDER_NAME>
|
||||
# 1. Clone repository
|
||||
git clone https://forgejo.plainrock127.xyz/mxnticek/UrNetwork-Stats-Dashboard-remade
|
||||
cd UrNetwork-Stats-Dashboard-remade
|
||||
|
||||
# 2. Install dependencies
|
||||
pip install Flask Flask-SQLAlchemy Flask-APScheduler requests python-dateutil
|
||||
|
||||
# 3. Run
|
||||
python main.py
|
||||
|
||||
# 4. Open browser
|
||||
# http://localhost:90
|
||||
```
|
||||
|
||||
2. **Create and activate a virtual environment (recommended):**
|
||||
**First Run Setup:**
|
||||
1. Set your **admin password** (NOT your UrNetwork password!)
|
||||
2. Add your UrNetwork accounts (email + password + nickname)
|
||||
3. Done! Dashboard will start collecting data every 15 minutes
|
||||
|
||||
```bash
|
||||
python -m venv venv
|
||||
# On Windows
|
||||
.venv\Scripts\activate
|
||||
# On macOS / Linux
|
||||
source venv/bin/activate
|
||||
📖 **Need more details?** See [QUICKSTART.md](QUICKSTART.md)
|
||||
|
||||
---
|
||||
|
||||
### 📊 Webhook Setup - Quick Examples
|
||||
|
||||
#### Discord - Simple
|
||||
```json
|
||||
{
|
||||
"content": "📊 **${account}**: ${total_gb} GB"
|
||||
}
|
||||
```
|
||||
|
||||
3. **Install requirements:**
|
||||
Create a `requirements.txt` file with the following content:
|
||||
|
||||
```txt
|
||||
Flask
|
||||
Flask-SQLAlchemy
|
||||
Flask-APScheduler
|
||||
requests
|
||||
python-dateutil
|
||||
gunicorn
|
||||
#### Discord - Rich Embed (Recommended)
|
||||
```json
|
||||
{
|
||||
"username": "UrNetwork Bot",
|
||||
"embeds": [{
|
||||
"title": "⚡ ${account} - New Data!",
|
||||
"color": 3901635,
|
||||
"fields": [
|
||||
{"name": "💰 Paid", "value": "`${paid_gb} GB`", "inline": true},
|
||||
{"name": "📡 Unpaid", "value": "`${unpaid_gb} GB`", "inline": true},
|
||||
{"name": "💾 Total", "value": "**${total_gb} GB**", "inline": false}
|
||||
],
|
||||
"footer": {"text": "UrNetwork Stats"},
|
||||
"timestamp": "${update_time}"
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
Then, install them:
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
#### Telegram
|
||||
```json
|
||||
{
|
||||
"chat_id": "YOUR_CHAT_ID",
|
||||
"text": "📊 *${account}*\n💾 Total: ${total_gb} GB\n💰 Paid: ${paid_gb} GB\n📡 Unpaid: ${unpaid_gb} GB",
|
||||
"parse_mode": "Markdown"
|
||||
}
|
||||
```
|
||||
|
||||
4. **Run the application:**
|
||||
**Available Variables:**
|
||||
- `${account}` - Account nickname
|
||||
- `${paid_gb}` - Paid data in GB
|
||||
- `${unpaid_gb}` - Unpaid data in GB
|
||||
- `${total_gb}` - Total data in GB
|
||||
- `${update_time}` - Timestamp
|
||||
|
||||
```bash
|
||||
python main_app.py
|
||||
📖 **Full webhook guide:** [WEBHOOK_GUIDE.md](WEBHOOK_GUIDE.md)
|
||||
|
||||
---
|
||||
|
||||
### 🎨 Why This Design?
|
||||
|
||||
After extensive testing, we chose a **clean Cloudflare-inspired design** because:
|
||||
|
||||
1. **Better Chart Visibility** - Solid dark background = better contrast
|
||||
2. **Professional Look** - Mimics enterprise dashboards
|
||||
3. **No Eye Strain** - Pure colors without gradients
|
||||
4. **Performance** - No blur effects = faster rendering
|
||||
5. **Accessibility** - High contrast ratios
|
||||
|
||||
**Color Scheme:**
|
||||
```css
|
||||
Background: #0c0d0e (Deep dark)
|
||||
Primary: #3b82f6 (Blue)
|
||||
Text: #e5e7eb (Light)
|
||||
Success: #10b981 (Green)
|
||||
Danger: #ef4444 (Red)
|
||||
```
|
||||
|
||||
*Note: For a production environment, it's better to use a WSGI server like `gunicorn`.*
|
||||
📖 **Design details:** [DESIGN_COMPARISON.md](DESIGN_COMPARISON.md)
|
||||
|
||||
```bash
|
||||
gunicorn --bind 0.0.0.0:90 main_app:app
|
||||
---
|
||||
|
||||
### 📁 Project Structure
|
||||
|
||||
```
|
||||
urnetwork-stats/
|
||||
├── main.py # Main application (use this!)
|
||||
├── instance/
|
||||
│ └── transfer_stats.db # SQLite database (auto-created)
|
||||
├── .env # Config (auto-created)
|
||||
├── README.md # This file
|
||||
├── requirements.txt # Dependencies
|
||||
└── docs/
|
||||
├── QUICKSTART.md # Quick start guide
|
||||
├── WEBHOOK_GUIDE.md # Webhook examples
|
||||
├── UPGRADE_GUIDE.md # Migration from v1.0
|
||||
├── DESIGN_COMPARISON.md # Design documentation
|
||||
└── CHANGELOG.md # Version history
|
||||
```
|
||||
|
||||
5. **Web-based Configuration:**
|
||||
|
||||
* Open `http://localhost:90` (or your server's IP address) in your browser.
|
||||
* You will be redirected to the setup page. Enter your UrNetwork **username** and **password**.
|
||||
* Upon successful verification, a `.env` file will be created with your credentials and a secret key will be generated for the session. The application is now installed.
|
||||
|
||||
-----
|
||||
|
||||
### 🕹️ Usage
|
||||
|
||||
After installation, the application is ready to use.
|
||||
|
||||
* **Public Dashboard (`/`):** The main page, accessible to anyone. It shows summary stats and the provider map. The data on this page updates automatically every minute without a page refresh.
|
||||
* **Private Dashboard (`/dashboard`):**
|
||||
* Click on "Owner Dashboard" to access it.
|
||||
* Log in using the same credentials you entered during setup.
|
||||
* Here you will find detailed charts, the full history of all measurements, and you can manage your webhooks.
|
||||
* **Fetch Now:** Manually triggers a data fetch from the API.
|
||||
* **Clear All Data:** Deletes all historical data from the database.
|
||||
* **Webhook Management:** Add or remove URLs for notifications.
|
||||
|
||||
-----
|
||||
---
|
||||
|
||||
### 🛠️ Tech Stack
|
||||
|
||||
* **Backend:** [Flask](https://flask.palletsprojects.com/)
|
||||
* **Database:** [Flask-SQLAlchemy](https://flask-sqlalchemy.palletsprojects.com/) (with SQLite)
|
||||
* **Job Scheduler:** [Flask-APScheduler](https://github.com/viniciuschiele/flask-apscheduler)
|
||||
* **Frontend:** [Tailwind CSS](https://tailwindcss.com/), [Chart.js](https://www.chartjs.org/), [Leaflet.js](https://leafletjs.com/)
|
||||
* **HTTP Requests:** [Requests](https://requests.readthedocs.io/en/latest/)
|
||||
- **Backend:** Flask 3.0+
|
||||
- **Database:** SQLAlchemy + SQLite
|
||||
- **Scheduler:** APScheduler
|
||||
- **Frontend:** React 18 (private dashboard)
|
||||
- **Charts:** Chart.js 4.0+
|
||||
- **Maps:** Leaflet.js 1.9+
|
||||
- **Styling:** Custom CSS (Cloudflare-inspired)
|
||||
|
||||
-----
|
||||
---
|
||||
|
||||
### 🙏 Acknowledgements
|
||||
|
||||
* Original concept and project by **[techroy23](https://github.com/techroy23/UrNetwork-Stats-Dashboard)**.
|
||||
* This version was completely refactored and extended with the help of AI.
|
||||
|
||||
<br>
|
||||
<hr>
|
||||
<br>
|
||||
|
||||
## 🇨🇿 Česky
|
||||
|
||||
### O Projektu
|
||||
|
||||
Tento projekt je výrazně vylepšená a refaktorovaná verze původního [UrNetwork Stats Dashboard](https://github.com/techroy23/UrNetwork-Stats-Dashboard). Aplikace slouží ke sledování, ukládání a vizualizaci statistik o přenesených datech (placených i neplacených) a výdělcích z vašeho účtu v síti UrNetwork.
|
||||
|
||||
Celá aplikace je zabalena do jediného souboru `main_app.py` pro jednoduchost, ale obsahuje robustní funkce, včetně webového instalátoru, autentizace, veřejného a soukromého pohledu, interaktivních grafů, mapy poskytovatelů a podpory pro webhooky.
|
||||
|
||||
> **Poznámka od Autora**
|
||||
>
|
||||
> Vím, že asi dostanu hejt za to, že jsem na stavbu a refaktoring použil AI, ale když k tomu mám přístup zadarmo, chci toho co nejvíc využít. Navíc, nic proti mým kamarádům, co umí programovat, ale Gemini mi to často vysvětlí srozumitelněji! (no hate)
|
||||
> (Tento soubor readme je také vytvořen umělou inteligencí... Prosím, nenávidějte mě, jsem debilní idiot, který je skoro mrtvýmozkově, a to ani nepřeháním.)
|
||||
|
||||
-----
|
||||
|
||||
### ✨ Klíčové Vlastnosti
|
||||
|
||||
* **🐍 All-in-One Python Skript:** Celá logika aplikace, včetně frontendu, je obsažena v jediném souboru `main_app.py`.
|
||||
* **🚀 Webový Instalátor:** Při prvním spuštění vás provede jednoduchým nastavením přihlašovacích údajů k UrNetwork API.
|
||||
* **🔐 Dva Pohledy (Public/Private):**
|
||||
* **Veřejný Dashboard:** Zobrazuje souhrnné statistiky, celkový objem dat v čase a mapu poskytovatelů po celém světě. Ideální pro rychlý přehled.
|
||||
* **Soukromý Dashboard:** Po přihlášení získáte přístup k detailním grafům, kompletní historii měření, správě webhooků a dalším administrátorským funkcím.
|
||||
* **📊 Interaktivní Grafy:** Využívá `Chart.js` pro vizualizaci dat, včetně:
|
||||
* Celkový objem dat v čase.
|
||||
* Porovnání placených vs. neplacených dat.
|
||||
* Graf přírůstků dat mezi jednotlivými měřeními.
|
||||
* **🗺️ Mapa Poskytovatelů:** Zobrazuje na mapě světa (pomocí `Leaflet.js`) počet aktivních poskytovatelů v jednotlivých zemích.
|
||||
* **⚙️ Automatický Sběr Dat:** Plánovač (`APScheduler`) automaticky stahuje a ukládá data z API každých 15 minut.
|
||||
* **🔔 Notifikace přes Webhooky:** Možnost přidat si vlastní webhooky (např. pro Discord) a dostávat notifikace při každé nové synchronizaci dat.
|
||||
* **🎨 Moderní UI:**
|
||||
* Stylováno pomocí **Tailwind CSS**.
|
||||
* Podpora **Světlého/Tmavého režimu** s možností synchronizace s nastavením systému.
|
||||
* Plně responzivní design.
|
||||
* **💾 Perzistentní Úložiště:** Využívá `SQLAlchemy` a `SQLite` databázi pro ukládání historických dat.
|
||||
|
||||
-----
|
||||
|
||||
### 🚀 Jak začít
|
||||
|
||||
#### Požadavky
|
||||
|
||||
* Python 3.x
|
||||
* Pip (správce balíčků pro Python)
|
||||
|
||||
#### Instalace
|
||||
|
||||
1. **Klonujte repozitář:**
|
||||
### 🔄 Upgrading from v1.0
|
||||
|
||||
```bash
|
||||
git clone <URL_VAŠEHO_REPOZITÁŘE>
|
||||
cd <NÁZEV_SLOŽKY>
|
||||
# 1. Backup
|
||||
cp .env .env.backup
|
||||
cp instance/transfer_stats.db instance/transfer_stats.db.backup
|
||||
|
||||
# 2. Download new version
|
||||
git pull
|
||||
|
||||
# 3. Run migration
|
||||
python migrate.py
|
||||
|
||||
# 4. Restart
|
||||
python main.py
|
||||
```
|
||||
|
||||
2. **Vytvořte a aktivujte virtuální prostředí (doporučeno):**
|
||||
Your existing account will be migrated automatically!
|
||||
|
||||
📖 **Full upgrade guide:** [UPGRADE_GUIDE.md](UPGRADE_GUIDE.md)
|
||||
|
||||
---
|
||||
|
||||
### 🐛 Troubleshooting
|
||||
|
||||
**Can't login?**
|
||||
```bash
|
||||
# Check admin password exists
|
||||
cat .env | grep ADMIN_PASSWORD
|
||||
|
||||
# If missing, add it
|
||||
echo "ADMIN_PASSWORD=your_password" >> .env
|
||||
```
|
||||
|
||||
**Charts not showing text?**
|
||||
- Make sure you're using `main.py` v2.1+ with white text
|
||||
|
||||
**Webhook not working?**
|
||||
1. Check URL is correct
|
||||
2. Validate JSON at [jsonlint.com](https://jsonlint.com/)
|
||||
3. Check logs: `tail -f nohup.out | grep webhook`
|
||||
|
||||
**Port already in use?**
|
||||
```python
|
||||
# Edit last line of main.py
|
||||
app.run(host="0.0.0.0", port=8080, debug=False) # Change port
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 🚀 Production Deployment
|
||||
|
||||
**With Gunicorn (recommended):**
|
||||
```bash
|
||||
pip install gunicorn
|
||||
gunicorn --bind 0.0.0.0:90 --workers 4 main:app
|
||||
```
|
||||
|
||||
**Systemd Service:**
|
||||
```ini
|
||||
[Unit]
|
||||
Description=UrNetwork Stats Dashboard
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=your_user
|
||||
WorkingDirectory=/path/to/urnetwork-stats
|
||||
ExecStart=/usr/bin/python3 main.py
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
```bash
|
||||
python -m venv venv
|
||||
# Windows
|
||||
.venv\Scripts\activate
|
||||
# macOS / Linux
|
||||
source venv/bin/activate
|
||||
sudo systemctl enable urnetwork-stats
|
||||
sudo systemctl start urnetwork-stats
|
||||
```
|
||||
|
||||
3. **Nainstalujte potřebné balíčky:**
|
||||
Vytvořte soubor `requirements.txt` s následujícím obsahem:
|
||||
---
|
||||
|
||||
```txt
|
||||
Flask
|
||||
Flask-SQLAlchemy
|
||||
Flask-APScheduler
|
||||
requests
|
||||
python-dateutil
|
||||
gunicorn
|
||||
```
|
||||
### 📊 Screenshots
|
||||
|
||||
A poté je nainstalujte:
|
||||
**Public Dashboard:**
|
||||
- Combined statistics from all accounts
|
||||
- Individual charts per account
|
||||
- World map of providers
|
||||
|
||||
**Private Dashboard:**
|
||||
- Overview with paid vs unpaid charts
|
||||
- Account details & leaderboard
|
||||
- Device management
|
||||
|
||||
**Account Management:**
|
||||
- Add unlimited accounts
|
||||
- Toggle on/off
|
||||
- Custom nicknames
|
||||
|
||||
---
|
||||
|
||||
### 🙏 Credits
|
||||
|
||||
- **Original:** [techroy23/UrNetwork-Stats-Dashboard](https://github.com/techroy23/UrNetwork-Stats-Dashboard)
|
||||
- **v2.0+ Enhanced by:** Claude (Anthropic AI)
|
||||
- **Design Inspiration:** Cloudflare, Vercel
|
||||
- **Special Thanks:** Vlastík (mxnticek) for testing
|
||||
|
||||
---
|
||||
|
||||
### 📜 License
|
||||
|
||||
Extends the original UrNetwork Stats Dashboard. Please respect the original author's work.
|
||||
|
||||
---
|
||||
|
||||
### 🔮 Roadmap (v3.0?)
|
||||
|
||||
- [ ] Dark/Light theme toggle
|
||||
- [ ] Email notifications
|
||||
- [ ] Export to CSV/JSON
|
||||
- [ ] Mobile app (React Native)
|
||||
- [ ] Advanced analytics
|
||||
- [ ] Docker container
|
||||
- [ ] Cost calculator
|
||||
|
||||
---
|
||||
|
||||
### 📞 Support
|
||||
|
||||
- **Issues:** Use GitHub/Forgejo Issues
|
||||
- **Pull Requests:** Contributions welcome!
|
||||
- **Documentation:** Help improve docs
|
||||
|
||||
---
|
||||
|
||||
## 🇨🇿 Česká Dokumentace
|
||||
|
||||
**Kompletní český README:** [README_CZ.md](README_CZ.md)
|
||||
|
||||
### Rychlý Start
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
# 1. Klonovat
|
||||
git clone https://forgejo.plainrock127.xyz/mxnticek/UrNetwork-Stats-Dashboard-remade
|
||||
cd UrNetwork-Stats-Dashboard-remade
|
||||
|
||||
# 2. Instalace
|
||||
pip install Flask Flask-SQLAlchemy Flask-APScheduler requests python-dateutil
|
||||
|
||||
# 3. Spustit
|
||||
python main.py
|
||||
|
||||
# 4. Otevřít prohlížeč
|
||||
# http://localhost:90
|
||||
```
|
||||
|
||||
4. **Spusťte aplikaci:**
|
||||
### Klíčové Funkce
|
||||
|
||||
```bash
|
||||
python main_app.py
|
||||
- 🎯 **Multi-Account** - Sledujte neomezený počet účtů
|
||||
- 📊 **Vylepšené Grafy** - Bílý text, tooltip kdekoliv
|
||||
- 🔐 **Oddělená Auth** - Admin heslo nezávislé na UrNetwork
|
||||
- ⚡ **Denní Čištění** - Auto-mazání dat starších 7 dní
|
||||
- 📱 **Mobilní** - Touch-friendly rozhraní
|
||||
|
||||
### Webhook Příklady
|
||||
|
||||
**Discord - Jednoduchý:**
|
||||
```json
|
||||
{
|
||||
"content": "📊 **${account}**: ${total_gb} GB"
|
||||
}
|
||||
```
|
||||
|
||||
*Poznámka: Pro produkční nasazení je lepší použít WSGI server jako `gunicorn`.*
|
||||
|
||||
```bash
|
||||
gunicorn --bind 0.0.0.0:90 main_app:app
|
||||
**Discord - Bohatý:**
|
||||
```json
|
||||
{
|
||||
"embeds": [{
|
||||
"title": "⚡ ${account} - Nová Data!",
|
||||
"color": 3901635,
|
||||
"fields": [
|
||||
{"name": "💰 Placená", "value": "`${paid_gb} GB`", "inline": true},
|
||||
{"name": "📡 Neplacená", "value": "`${unpaid_gb} GB`", "inline": true}
|
||||
]
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
5. **Webová konfigurace:**
|
||||
**Telegram:**
|
||||
```json
|
||||
{
|
||||
"chat_id": "VAŠE_CHAT_ID",
|
||||
"text": "📊 *${account}*\n💾 Celkem: ${total_gb} GB",
|
||||
"parse_mode": "Markdown"
|
||||
}
|
||||
```
|
||||
|
||||
* Otevřete v prohlížeči adresu `http://localhost:90` (nebo IP adresu vašeho serveru).
|
||||
* Budete přesměrováni na instalační stránku. Zde zadejte své **uživatelské jméno** a **heslo** k účtu UrNetwork.
|
||||
* Po úspěšném ověření se automaticky vytvoří soubor `.env` s vašimi údaji a vygeneruje se tajný klíč pro session. Aplikace se tímto nainstaluje.
|
||||
📖 **Kompletní návod:** [WEBHOOK_GUIDE.md](WEBHOOK_GUIDE.md)
|
||||
|
||||
-----
|
||||
---
|
||||
|
||||
### 🕹️ Použití
|
||||
**Version:** v2.1.1 | **Last Updated:** November 21, 2024
|
||||
|
||||
Po instalaci je aplikace připravena k použití.
|
||||
|
||||
* **Veřejný Dashboard (`/`):** Hlavní stránka dostupná komukoliv. Zobrazuje souhrnné statistiky a mapu. Data na této stránce se automaticky aktualizují každou minutu bez nutnosti obnovení stránky.
|
||||
* **Soukromý Dashboard (`/dashboard`):**
|
||||
* Pro přístup klikněte na "Owner Dashboard".
|
||||
* Přihlaste se pomocí stejných údajů, které jste zadali při instalaci.
|
||||
* Zde naleznete detailní grafy, historii všech měření a můžete spravovat webhooky.
|
||||
* **Fetch Now:** Manuálně spustí sběr dat z API.
|
||||
* **Clear All Data:** Smaže veškerá historická data z databáze.
|
||||
* **Webhook Management:** Přidávejte nebo odebírejte URL pro notifikace.
|
||||
|
||||
-----
|
||||
|
||||
### 🛠️ Použité Technologie
|
||||
|
||||
* **Backend:** [Flask](https://flask.palletsprojects.com/)
|
||||
* **Databáze:** [Flask-SQLAlchemy](https://flask-sqlalchemy.palletsprojects.com/) (s SQLite)
|
||||
* **Plánovač úloh:** [Flask-APScheduler](https://github.com/viniciuschiele/flask-apscheduler)
|
||||
* **Frontend:** [Tailwind CSS](https://tailwindcss.com/), [Chart.js](https://www.chartjs.org/), [Leaflet.js](https://leafletjs.com/)
|
||||
* **HTTP Požadavky:** [Requests](https://requests.readthedocs.io/en/latest/)
|
||||
|
||||
-----
|
||||
|
||||
### 🙏 Poděkování
|
||||
|
||||
* Původní koncept a projekt vytvořil **[techroy23](https://github.com/techroy23/UrNetwork-Stats-Dashboard)**.
|
||||
* Tato verze byla kompletně refaktorována a rozšířena pomocí AI.
|
||||
**Made with ❤️ and 🤖 AI**
|
||||
|
|
|
|||
6
requirements.txt
Normal file
6
requirements.txt
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
Flask==3.0.0
|
||||
Flask-SQLAlchemy==3.1.1
|
||||
Flask-APScheduler==1.13.1
|
||||
requests==2.31.0
|
||||
python-dateutil==2.8.2
|
||||
gunicorn==21.2.0
|
||||
Loading…
Add table
Add a link
Reference in a new issue