Dashboard do monitorowania aplikacji SaaS z sliding window.
observer-frontend/
├── src/
│ ├── App.svelte # Główny komponent
│ ├── app.css # Globalne style (zmienne CSS, layout)
│ ├── main.js # Entry point
│ ├── config/
│ │ └── apps.js # ← KONFIGURACJA APLIKACJI
│ └── lib/
│ └── components/
│ ├── Topbar.svelte # Górny pasek
│ └── AppCard.svelte # Kafelek aplikacji
├── public/
│ └── favicon.svg
├── index.html
├── package.json
├── vite.config.js
└── svelte.config.js
Edytuj plik src/config/apps.js:
export const apps = [
{
id: 'my-app', // unikalny identyfikator
name: 'My Application', // nazwa wyświetlana
url: 'https://...', // URL (kliknięcie w nazwę)
group: 'My Group', // grupa do filtrowania
},
// ... dodaj więcej aplikacji
];
W tym samym pliku src/config/apps.js:
export const slidingWindowConfig = {
slots: 4, // liczba slotów (barów) na kafelku
intervalMinutes: 15, // interwał między slotami
refreshSeconds: 60, // jak często odświeżać
};
# Ubuntu/Debian - NodeSource (zalecane)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
# RHEL/CentOS/Fedora
curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -
sudo yum install -y nodejs
# Sprawdź wersję
node --version # v20.x.x
npm --version # 10.x.x
# Rozpakuj archiwum
tar -xzvf observer-frontend.tar.gz
cd observer-frontend
# Zainstaluj zależności
npm install
npm run dev
# Otwórz w przeglądarce: http://localhost:5173
npm run build
# Pliki statyczne w: dist/
Frontend na porcie 5173, backend na 8000.
Proxy jest już skonfigurowane w vite.config.js.
# Terminal 1 - backend
cd observer
python -m uvicorn app.main:app --reload
# Terminal 2 - frontend
cd observer-frontend
npm run dev
Build frontend → kopiuj do static/ backendu.
# Build
npm run build
# Kopiuj do backendu
cp -r dist/* ../observer/static/
# Serwuj przez FastAPI
python -m uvicorn app.main:app
:root {
--color-ok: #22c55e; /* Zielony - OK */
--color-error: #ef4444; /* Czerwony - Error */
--color-pending: #6b7280; /* Szary - Brak danych */
--color-kyndryl-red: #FF462D;
}
.dark - ciemny motyw (domyślny).light - jasny motyw# Skopiuj pliki fontów
mkdir -p public/fonts
cp TWKEverett-Regular-web.woff2 public/fonts/
Dodaj do app.css:
@font-face {
font-family: 'Everett';
src: url('/fonts/TWKEverett-Regular-web.woff2') format('woff2');
font-weight: normal;
font-style: normal;
}
W App.svelte zamień mock data na fetch:
<script>
import { onMount } from 'svelte';
let apps = [];
onMount(async () => {
const response = await fetch('/api/status');
const data = await response.json();
apps = data.apps;
});
// Odświeżaj co 30 sekund
setInterval(async () => {
const response = await fetch('/api/status');
const data = await response.json();
apps = data.apps;
}, 30000);
</script>