Test custom.css
@@ -1,60 +1,56 @@
|
|||||||
# KalliLab bookmarks.yaml
|
---
|
||||||
# Korrektes Homepage-Format: Properties als Liste unter dem Namen
|
# KalliLab — bookmarks.yaml
|
||||||
|
|
||||||
- Dokumentation:
|
|
||||||
- Homepage Docs:
|
|
||||||
- href: https://gethomepage.dev/latest/
|
|
||||||
description: Offizielle Homepage-Dokumentation
|
|
||||||
icon: mdi-book-open-page-variant
|
|
||||||
|
|
||||||
- Homepage GitHub:
|
|
||||||
- href: https://github.com/gethomepage/homepage
|
|
||||||
description: Quellcode und Releases
|
|
||||||
icon: mdi-github
|
|
||||||
|
|
||||||
- Portainer Docs:
|
|
||||||
- href: https://docs.portainer.io
|
|
||||||
description: Doku für Container-Management
|
|
||||||
icon: mdi-docker
|
|
||||||
|
|
||||||
- Traefik Docs:
|
|
||||||
- href: https://doc.traefik.io/traefik/
|
|
||||||
description: Reverse-Proxy-Dokumentation
|
|
||||||
icon: mdi-swap-horizontal
|
|
||||||
|
|
||||||
- KalliLab:
|
|
||||||
- Gitea:
|
|
||||||
- href: https://git.kaleschke.info
|
|
||||||
description: Repositories und Config-Backups
|
|
||||||
icon: mdi-source-repository
|
|
||||||
|
|
||||||
- Homepage:
|
|
||||||
- href: https://home.kaleschke.info
|
|
||||||
description: Dashboard Startseite
|
|
||||||
icon: mdi-view-dashboard
|
|
||||||
|
|
||||||
- Traefik Dashboard:
|
|
||||||
- href: https://traefik.kaleschke.info
|
|
||||||
description: Router, Services und Middleware
|
|
||||||
icon: mdi-swap-horizontal
|
|
||||||
|
|
||||||
- Portainer:
|
|
||||||
- href: https://kallilabcore.local:9443
|
|
||||||
description: Docker-Stacks und Container
|
|
||||||
icon: mdi-docker
|
|
||||||
|
|
||||||
- Admin & Remote:
|
|
||||||
- Tailscale Admin:
|
|
||||||
- href: https://login.tailscale.com/admin/machines
|
|
||||||
description: Tailnet und Geräteverwaltung
|
|
||||||
icon: mdi-shield-key
|
|
||||||
|
|
||||||
- Cloudflare Dashboard:
|
|
||||||
- href: https://dash.cloudflare.com
|
|
||||||
description: DNS und Tunnel/Records
|
|
||||||
icon: mdi-cloud
|
|
||||||
|
|
||||||
|
- Dev & Infra:
|
||||||
- GitHub:
|
- GitHub:
|
||||||
- href: https://github.com
|
- abbr: GH
|
||||||
description: Code, Releases und Integrationen
|
href: https://github.com
|
||||||
icon: mdi-github
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/github.webp
|
||||||
|
- Docker Hub:
|
||||||
|
- abbr: DH
|
||||||
|
href: https://hub.docker.com
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/docker.webp
|
||||||
|
- Cloudflare:
|
||||||
|
- abbr: CF
|
||||||
|
href: https://dash.cloudflare.com
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/cloudflare.webp
|
||||||
|
- Tailscale:
|
||||||
|
- abbr: TS
|
||||||
|
href: https://login.tailscale.com/admin/machines
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/tailscale.webp
|
||||||
|
|
||||||
|
- KalliLab Direkt:
|
||||||
|
- Traefik:
|
||||||
|
- abbr: TR
|
||||||
|
href: https://traefik.kaleschke.info
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/traefik.webp
|
||||||
|
- Gitea:
|
||||||
|
- abbr: GT
|
||||||
|
href: https://git.kaleschke.info
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/gitea.webp
|
||||||
|
- Homepage:
|
||||||
|
- abbr: HP
|
||||||
|
href: https://home.kaleschke.info
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/homepage.webp
|
||||||
|
- Code Server:
|
||||||
|
- abbr: CS
|
||||||
|
href: https://code.kaleschke.info
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/code-server.webp
|
||||||
|
|
||||||
|
- Homelab Tools:
|
||||||
|
- Homepage Docs:
|
||||||
|
- abbr: HD
|
||||||
|
href: https://gethomepage.dev
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/homepage.webp
|
||||||
|
- selfh.st Icons:
|
||||||
|
- abbr: IC
|
||||||
|
href: https://selfh.st/icons
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/homepage.webp
|
||||||
|
- r/selfhosted:
|
||||||
|
- abbr: RS
|
||||||
|
href: https://www.reddit.com/r/selfhosted
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/reddit.webp
|
||||||
|
- Awesome Selfhosted:
|
||||||
|
- abbr: AS
|
||||||
|
href: https://awesome-selfhosted.net
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/github.webp
|
||||||
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 3.9 MiB |
|
After Width: | Height: | Size: 2.2 MiB |
|
After Width: | Height: | Size: 947 KiB |
@@ -1,3 +1,407 @@
|
|||||||
document.addEventListener("DOMContentLoaded", () => {
|
/* ============================================================================
|
||||||
document.title = "KALLILAB CORE";
|
KalliLab — CUSTOM JAVASCRIPT
|
||||||
});
|
Basiert auf LionCityGaming/homepage custom.js (MIT License)
|
||||||
|
Anpassungen: KalliLab Tab-Namen, keine HA/EPL/Glance iFrames
|
||||||
|
============================================================================ */
|
||||||
|
|
||||||
|
const CONFIG = {
|
||||||
|
STORAGE: {
|
||||||
|
KEY: "lastFocusedTabId",
|
||||||
|
},
|
||||||
|
TIMING: {
|
||||||
|
RETRY_DELAY: 500,
|
||||||
|
STANDARD_REFRESH: 1800000, // 30 Minuten
|
||||||
|
QUICK_REFRESH: 60000, // 1 Minute
|
||||||
|
RETRY_ON_ERROR: 30000,
|
||||||
|
BATCH_DELAY: 100,
|
||||||
|
},
|
||||||
|
SERVICES: {
|
||||||
|
QUICK_REFRESH: [], // keine kritischen Quick-Refresh Widgets
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const RELOAD_BUTTON_SELECTORS = [
|
||||||
|
"#revalidate",
|
||||||
|
'[data-testid="revalidate"]',
|
||||||
|
".reload-button",
|
||||||
|
'button[aria-label="Reload"]',
|
||||||
|
'[role="button"][aria-label="Reload"]',
|
||||||
|
];
|
||||||
|
|
||||||
|
// Keine iFrame-Widgets in KalliLab
|
||||||
|
const IFRAME_CONFIG = [];
|
||||||
|
|
||||||
|
// Tab-Mapping für KalliLab Tabs (5 Tabs)
|
||||||
|
const TAB_MAPPING = {
|
||||||
|
"#ueberblick": ["#Überblick-tab", "#Überblick"],
|
||||||
|
"#system": ["#System-tab", "#System"],
|
||||||
|
"#sicherheit": ["#Sicherheit-tab", "#Sicherheit"],
|
||||||
|
"#dienste": ["#Dienste-tab", "#Dienste"],
|
||||||
|
"#backends": ["#Backends-tab", "#Backends"],
|
||||||
|
"": ["#Überblick-tab", "#Überblick"],
|
||||||
|
};
|
||||||
|
|
||||||
|
const state = {
|
||||||
|
lastUpdate: new WeakMap(),
|
||||||
|
currentFocusedTab: null,
|
||||||
|
observers: {
|
||||||
|
reloadButton: null,
|
||||||
|
resize: null,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const domCache = {
|
||||||
|
myTab: null,
|
||||||
|
tabContents: null,
|
||||||
|
activeTabContent: null,
|
||||||
|
|
||||||
|
initCache() {
|
||||||
|
this.myTab = document.getElementById("myTab");
|
||||||
|
this.tabContents = document.querySelectorAll(".tabcontent");
|
||||||
|
this.updateActiveTab();
|
||||||
|
},
|
||||||
|
|
||||||
|
updateActiveTab() {
|
||||||
|
this.activeTabContent = document.querySelector(".tabcontent.active");
|
||||||
|
},
|
||||||
|
|
||||||
|
clear() {
|
||||||
|
this.myTab = null;
|
||||||
|
this.tabContents = null;
|
||||||
|
this.activeTabContent = null;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const storage = {
|
||||||
|
save(tabId) {
|
||||||
|
try {
|
||||||
|
localStorage.setItem(CONFIG.STORAGE.KEY, tabId);
|
||||||
|
} catch (error) {
|
||||||
|
console.warn("Storage save failed:", error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
get() {
|
||||||
|
try {
|
||||||
|
return localStorage.getItem(CONFIG.STORAGE.KEY);
|
||||||
|
} catch (error) {
|
||||||
|
console.warn("Storage retrieval failed:", error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
function debounce(func, wait) {
|
||||||
|
let timeout;
|
||||||
|
return function executedFunction(...args) {
|
||||||
|
clearTimeout(timeout);
|
||||||
|
timeout = setTimeout(() => func(...args), wait);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function throttle(func, limit) {
|
||||||
|
let inThrottle;
|
||||||
|
return function executedFunction(...args) {
|
||||||
|
if (!inThrottle) {
|
||||||
|
func.apply(this, args);
|
||||||
|
inThrottle = true;
|
||||||
|
setTimeout(() => (inThrottle = false), limit);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeReloadButton() {
|
||||||
|
RELOAD_BUTTON_SELECTORS.forEach((selector) => {
|
||||||
|
document.querySelectorAll(selector).forEach((element) => element.remove());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupReloadButtonObserver() {
|
||||||
|
if (state.observers.reloadButton) {
|
||||||
|
return state.observers.reloadButton;
|
||||||
|
}
|
||||||
|
|
||||||
|
const observer = new MutationObserver(
|
||||||
|
throttle((mutations) => {
|
||||||
|
const hasAddedNodes = mutations.some((m) => m.addedNodes.length > 0);
|
||||||
|
if (hasAddedNodes) {
|
||||||
|
removeReloadButton();
|
||||||
|
}
|
||||||
|
}, 100),
|
||||||
|
);
|
||||||
|
|
||||||
|
observer.observe(document.body, {
|
||||||
|
childList: true,
|
||||||
|
subtree: true,
|
||||||
|
attributes: true,
|
||||||
|
attributeFilter: ["class", "style"],
|
||||||
|
});
|
||||||
|
|
||||||
|
state.observers.reloadButton = observer;
|
||||||
|
return observer;
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateServiceCard(card, data) {
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
const titleElement = card.querySelector(".card-title");
|
||||||
|
const statusElement = card.querySelector(".card-status");
|
||||||
|
|
||||||
|
if (titleElement && data.title) {
|
||||||
|
titleElement.textContent = data.title;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (statusElement) {
|
||||||
|
statusElement.textContent = Array.isArray(data)
|
||||||
|
? `${data.length} items`
|
||||||
|
: (data.status ?? (typeof data === "object" ? "Data received" : ""));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateServiceCardError(card, error) {
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
const statusElement = card.querySelector(".card-status");
|
||||||
|
if (statusElement) {
|
||||||
|
statusElement.textContent = error.message.includes("404")
|
||||||
|
? "Service unavailable"
|
||||||
|
: "Error loading data";
|
||||||
|
statusElement.style.color = "red";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function refreshService(card) {
|
||||||
|
const apiEndpoint = card.dataset.apiEndpoint;
|
||||||
|
if (!apiEndpoint) return;
|
||||||
|
|
||||||
|
const serviceId = card.id || apiEndpoint;
|
||||||
|
const now = Date.now();
|
||||||
|
const lastUpdateTime = state.lastUpdate.get(card) || 0;
|
||||||
|
const isQuickRefreshService = CONFIG.SERVICES.QUICK_REFRESH.includes(serviceId);
|
||||||
|
const minInterval = isQuickRefreshService
|
||||||
|
? CONFIG.TIMING.QUICK_REFRESH
|
||||||
|
: CONFIG.TIMING.STANDARD_REFRESH;
|
||||||
|
|
||||||
|
if (now - lastUpdateTime < minInterval) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
card.classList.add("updating");
|
||||||
|
|
||||||
|
const response = await fetch(apiEndpoint, {
|
||||||
|
signal: AbortSignal.timeout(10000),
|
||||||
|
}).then((r) => {
|
||||||
|
if (!r.ok) throw new Error(`HTTP ${r.status}`);
|
||||||
|
return r.json();
|
||||||
|
});
|
||||||
|
|
||||||
|
updateServiceCard(card, response);
|
||||||
|
state.lastUpdate.set(card, now);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`${serviceId} refresh failed:`, error);
|
||||||
|
updateServiceCardError(card, error);
|
||||||
|
state.lastUpdate.set(card, now - (minInterval - CONFIG.TIMING.RETRY_ON_ERROR));
|
||||||
|
} finally {
|
||||||
|
card.classList.remove("updating");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function batchUpdateServiceCards(cards) {
|
||||||
|
const batchSize = 3;
|
||||||
|
const batches = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < cards.length; i += batchSize) {
|
||||||
|
batches.push(cards.slice(i, i + batchSize));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const batch of batches) {
|
||||||
|
await Promise.all(batch.map(refreshService));
|
||||||
|
if (batches.length > 1) {
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, CONFIG.TIMING.BATCH_DELAY));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleTabFocusFromURL() {
|
||||||
|
const hash = window.location.hash.toLowerCase();
|
||||||
|
const mapping = TAB_MAPPING[hash] || TAB_MAPPING[""];
|
||||||
|
const [tabSelector, contentSelector] = mapping;
|
||||||
|
|
||||||
|
const tabToFocus = document.querySelector(tabSelector);
|
||||||
|
const contentToShow = document.querySelector(contentSelector);
|
||||||
|
|
||||||
|
if (tabToFocus) {
|
||||||
|
setTabFocus(tabToFocus);
|
||||||
|
storage.save(tabToFocus.id);
|
||||||
|
|
||||||
|
domCache.tabContents.forEach((content) => {
|
||||||
|
content.classList.remove("active");
|
||||||
|
content.style.display = "none";
|
||||||
|
});
|
||||||
|
|
||||||
|
if (contentToShow) {
|
||||||
|
showTabContent(contentToShow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setTabFocus(tab) {
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
if (state.currentFocusedTab) {
|
||||||
|
state.currentFocusedTab.classList.remove("tab-focused");
|
||||||
|
}
|
||||||
|
state.currentFocusedTab = tab;
|
||||||
|
state.currentFocusedTab.classList.add("tab-focused");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function showTabContent(contentElement) {
|
||||||
|
if (!contentElement) return;
|
||||||
|
|
||||||
|
contentElement.classList.add("active");
|
||||||
|
contentElement.style.display = "block";
|
||||||
|
domCache.updateActiveTab();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function preloadAllTabs() {
|
||||||
|
const tabContents = document.querySelectorAll(".tab-pane");
|
||||||
|
const serviceCards = new Set();
|
||||||
|
|
||||||
|
tabContents.forEach((tab) => {
|
||||||
|
tab.querySelectorAll(".service-card").forEach((card) => serviceCards.add(card));
|
||||||
|
});
|
||||||
|
|
||||||
|
await batchUpdateServiceCards(Array.from(serviceCards));
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupPeriodicRefresh() {
|
||||||
|
const debouncedRefresh = debounce(async () => {
|
||||||
|
if (domCache.activeTabContent) {
|
||||||
|
const cards = domCache.activeTabContent.querySelectorAll(
|
||||||
|
".service-card[data-api-endpoint]",
|
||||||
|
);
|
||||||
|
await batchUpdateServiceCards(Array.from(cards));
|
||||||
|
}
|
||||||
|
}, 250);
|
||||||
|
|
||||||
|
setInterval(
|
||||||
|
debouncedRefresh,
|
||||||
|
Math.min(CONFIG.TIMING.QUICK_REFRESH, CONFIG.TIMING.STANDARD_REFRESH),
|
||||||
|
);
|
||||||
|
|
||||||
|
document.addEventListener("visibilitychange", () => {
|
||||||
|
if (document.visibilityState === "visible") {
|
||||||
|
debouncedRefresh();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
domCache.myTab?.addEventListener("click", (event) => {
|
||||||
|
if (event.target.matches('[id$="-tab"]')) {
|
||||||
|
debouncedRefresh();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function initializeTabFocus() {
|
||||||
|
// KalliLab Tab-Selektoren
|
||||||
|
const tabs = document.querySelectorAll(
|
||||||
|
"#Überblick-tab, #System-tab, #Sicherheit-tab, #Dienste-tab, #Backends-tab",
|
||||||
|
);
|
||||||
|
|
||||||
|
handleTabFocusFromURL();
|
||||||
|
|
||||||
|
if (!window.location.hash) {
|
||||||
|
const savedTabId = storage.get();
|
||||||
|
const savedTab = savedTabId && document.getElementById(savedTabId);
|
||||||
|
|
||||||
|
if (savedTab) {
|
||||||
|
setTabFocus(savedTab);
|
||||||
|
} else {
|
||||||
|
const activeTab = document.querySelector(".tabcontent.active");
|
||||||
|
const correspondingTab =
|
||||||
|
activeTab && document.querySelector(`[aria-controls="${activeTab.id}"]`);
|
||||||
|
if (correspondingTab) {
|
||||||
|
setTabFocus(correspondingTab);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tabs.forEach((tab) => {
|
||||||
|
const handleTabAction = function () {
|
||||||
|
setTabFocus(this);
|
||||||
|
storage.save(this.id);
|
||||||
|
};
|
||||||
|
|
||||||
|
tab.addEventListener("click", handleTabAction);
|
||||||
|
|
||||||
|
tab.addEventListener("keydown", function (e) {
|
||||||
|
if (e.key === "Enter" || e.key === " ") {
|
||||||
|
e.preventDefault();
|
||||||
|
this.click();
|
||||||
|
handleTabAction.call(this);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
window.addEventListener("beforeunload", () => {
|
||||||
|
if (state.currentFocusedTab) {
|
||||||
|
storage.save(state.currentFocusedTab.id);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function initializeEverything() {
|
||||||
|
removeReloadButton();
|
||||||
|
setupReloadButtonObserver();
|
||||||
|
|
||||||
|
[100, 500, 1000].forEach((delay) => {
|
||||||
|
setTimeout(removeReloadButton, delay);
|
||||||
|
});
|
||||||
|
|
||||||
|
const hasRequiredElements =
|
||||||
|
document.querySelector("#myTab") && document.querySelector(".service-card");
|
||||||
|
|
||||||
|
if (hasRequiredElements) {
|
||||||
|
domCache.initCache();
|
||||||
|
initializeTabFocus();
|
||||||
|
preloadAllTabs();
|
||||||
|
setupPeriodicRefresh();
|
||||||
|
} else {
|
||||||
|
setTimeout(initializeEverything, CONFIG.TIMING.RETRY_DELAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener("orientationchange", () => {
|
||||||
|
setTimeout(removeReloadButton, 100);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener("DOMContentLoaded", removeReloadButton);
|
||||||
|
window.addEventListener("load", initializeEverything);
|
||||||
|
|
||||||
|
if (typeof window.htmlLoaded === "function") {
|
||||||
|
const originalHtmlLoaded = window.htmlLoaded;
|
||||||
|
window.htmlLoaded = () => {
|
||||||
|
originalHtmlLoaded();
|
||||||
|
initializeEverything();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("ontouchstart" in window) {
|
||||||
|
window.addEventListener("touchend", () => {
|
||||||
|
setTimeout(removeReloadButton, 100);
|
||||||
|
}, { passive: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
function cleanup() {
|
||||||
|
if (state.observers.reloadButton) {
|
||||||
|
state.observers.reloadButton.disconnect();
|
||||||
|
state.observers.reloadButton = null;
|
||||||
|
}
|
||||||
|
if (state.observers.resize) {
|
||||||
|
state.observers.resize.disconnect();
|
||||||
|
state.observers.resize = null;
|
||||||
|
}
|
||||||
|
domCache.clear();
|
||||||
|
state.currentFocusedTab = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener("unload", cleanup);
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
my-docker:
|
my-docker:
|
||||||
socketPath: /var/run/docker.sock
|
socket: /var/run/docker.sock
|
||||||
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 2.2 MiB |
|
After Width: | Height: | Size: 947 KiB |
@@ -1,52 +1,128 @@
|
|||||||
# KalliLab Homepage services.yaml
|
---
|
||||||
# KALLISCOPE Redesign — V7 (Bugfix)
|
# ============================================================================
|
||||||
# Alle URLs, Tokens, Keys und Container UNVERÄNDERT
|
# KalliLab — services.yaml
|
||||||
# Emojis aus Gruppen-Namen entfernt (Tab-Rendering-Fix)
|
# Neu strukturiert auf 2 Tabs: Home + Media
|
||||||
# Bookmarks ausgelagert in bookmarks.yaml
|
# URLs / Tokens / Keys unverändert übernommen
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
# ────────────────────────────────────────────────────────
|
# ============================================================================
|
||||||
# TAB: Uebersicht — Tägliche Arbeitsoberfläche
|
# TAB: Home — SYSTEM TELEMETRY
|
||||||
# ────────────────────────────────────────────────────────
|
# ============================================================================
|
||||||
- Control Center:
|
- SYSTEM TELEMETRY:
|
||||||
- Portainer:
|
|
||||||
icon: portainer.png
|
|
||||||
href: https://kallilabcore.local:9443
|
|
||||||
description: Docker- und Stack-Management
|
|
||||||
server: my-docker
|
|
||||||
container: PortainerCE
|
|
||||||
widget:
|
|
||||||
type: portainer
|
|
||||||
url: https://192.168.178.58:9443
|
|
||||||
env: 1
|
|
||||||
key: ptr_OoyIiXDLUaCj5sbYzr3f2BmeBVgi+WVnZDyX1OOlvJo=
|
|
||||||
|
|
||||||
- Immich:
|
- System Info:
|
||||||
icon: immich.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/glances.webp
|
||||||
href: http://kallilabcore.local:2283
|
href: http://kallilabcore.local:61208
|
||||||
description: Foto- und Videoverwaltung
|
description: OS · Kernel · Uptime
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: immich_server
|
container: Glances
|
||||||
widget:
|
widget:
|
||||||
type: immich
|
type: glances
|
||||||
url: http://192.168.178.58:2283
|
url: http://192.168.178.58:61208
|
||||||
key: FjgVSrXUaHZ7cymFtd1adRpq2naz1nijTqjqxuvGbs
|
version: 4
|
||||||
version: 2
|
metric: info
|
||||||
|
|
||||||
- Paperless-ngx:
|
- CPU Usage:
|
||||||
icon: paperless-ngx.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/glances.webp
|
||||||
href: http://kallilabcore.local:8000
|
href: http://kallilabcore.local:61208
|
||||||
description: Dokumentenarchiv und OCR
|
description: Prozessorauslastung
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: paperless-ngx
|
container: Glances
|
||||||
widget:
|
widget:
|
||||||
type: paperlessngx
|
type: glances
|
||||||
url: http://192.168.178.58:8000
|
url: http://192.168.178.58:61208
|
||||||
key: 65aa6948d2a6f3ef3d403a4a0d76891e7ae82cbe
|
version: 4
|
||||||
|
metric: cpu
|
||||||
|
chart: true
|
||||||
|
|
||||||
|
- Memory:
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/glances.webp
|
||||||
|
href: http://kallilabcore.local:61208
|
||||||
|
description: RAM-Nutzung
|
||||||
|
server: my-docker
|
||||||
|
container: Glances
|
||||||
|
widget:
|
||||||
|
type: glances
|
||||||
|
url: http://192.168.178.58:61208
|
||||||
|
version: 4
|
||||||
|
metric: memory
|
||||||
|
chart: true
|
||||||
|
|
||||||
|
- Network:
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/glances.webp
|
||||||
|
href: http://kallilabcore.local:61208
|
||||||
|
description: Netzwerk-Traffic
|
||||||
|
server: my-docker
|
||||||
|
container: Glances
|
||||||
|
widget:
|
||||||
|
type: glances
|
||||||
|
url: http://192.168.178.58:61208
|
||||||
|
version: 4
|
||||||
|
metric: network:eth0
|
||||||
|
chart: true
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# TAB: Home — STORAGE & I/O
|
||||||
|
# ============================================================================
|
||||||
|
- STORAGE & I/O:
|
||||||
|
|
||||||
|
- System Disk:
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/scrutiny-light.webp
|
||||||
|
href: http://192.168.178.58:8080/web/dashboard
|
||||||
|
description: Primärer Datenträger
|
||||||
|
server: my-docker
|
||||||
|
container: Glances
|
||||||
|
widget:
|
||||||
|
type: glances
|
||||||
|
url: http://192.168.178.58:61208
|
||||||
|
version: 4
|
||||||
|
metric: fs:/
|
||||||
|
|
||||||
|
- Disk I/O:
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/glances.webp
|
||||||
|
href: http://kallilabcore.local:61208
|
||||||
|
description: Lese-/Schreibraten
|
||||||
|
server: my-docker
|
||||||
|
container: Glances
|
||||||
|
widget:
|
||||||
|
type: glances
|
||||||
|
url: http://192.168.178.58:61208
|
||||||
|
version: 4
|
||||||
|
metric: disk:sda
|
||||||
|
chart: true
|
||||||
|
|
||||||
|
- S.M.A.R.T. Status:
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/scrutiny-light.webp
|
||||||
|
href: http://192.168.178.58:8080/web/dashboard
|
||||||
|
description: Festplatten-Gesundheit
|
||||||
|
server: my-docker
|
||||||
|
container: scrutiny
|
||||||
|
widget:
|
||||||
|
type: scrutiny
|
||||||
|
url: http://192.168.178.58:8080
|
||||||
|
|
||||||
|
- Top Processes:
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/glances.webp
|
||||||
|
href: http://kallilabcore.local:61208
|
||||||
|
description: Prozesse nach CPU
|
||||||
|
server: my-docker
|
||||||
|
container: Glances
|
||||||
|
widget:
|
||||||
|
type: glances
|
||||||
|
url: http://192.168.178.58:61208
|
||||||
|
version: 4
|
||||||
|
metric: process
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# TAB: Home — CORE SERVICES
|
||||||
|
# Hero-Bereich oben
|
||||||
|
# ============================================================================
|
||||||
|
- CORE SERVICES:
|
||||||
|
|
||||||
- Pi-hole:
|
- Pi-hole:
|
||||||
icon: pi-hole.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/pi-hole.webp
|
||||||
href: http://kallilabcore.local:8543
|
href: http://kallilabcore.local:8543
|
||||||
description: Netzwerkweites DNS-Blocking
|
description: DNS-Blocking · Netzwerkschutz
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: binhex-official-pihole
|
container: binhex-official-pihole
|
||||||
widget:
|
widget:
|
||||||
@@ -55,30 +131,96 @@
|
|||||||
version: 6
|
version: 6
|
||||||
key: kuchen123
|
key: kuchen123
|
||||||
|
|
||||||
- Code Server:
|
- Portainer:
|
||||||
icon: vscode.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/portainer.webp
|
||||||
href: https://code.kaleschke.info
|
href: https://kallilabcore.local:9443
|
||||||
description: Browserbasierte Entwicklungsumgebung
|
description: Docker · Stack Management
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: code-server
|
container: PortainerCE
|
||||||
ping: true
|
widget:
|
||||||
|
type: portainer
|
||||||
|
url: https://192.168.178.58:9443
|
||||||
|
env: 2
|
||||||
|
key: ptr_OoyIiXDLUaCj5sbYzr3f2BmeBVgi+WVnZDyX1OOlvJo=
|
||||||
|
|
||||||
- Paperless-AI:
|
- Uptime Kuma:
|
||||||
icon: mdi-file-document-edit-outline
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/uptime-kuma.webp
|
||||||
href: http://kallilabcore.local:3236
|
href: http://kallilabcore.local:3001
|
||||||
description: KI-Auswertung für Paperless-ngx
|
description: Service-Monitoring · Statusseiten
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: Paperless-AI
|
container: UptimeKuma
|
||||||
ping: true
|
widget:
|
||||||
|
type: uptimekuma
|
||||||
|
url: http://192.168.178.58:3001
|
||||||
|
slug: kallilab
|
||||||
|
|
||||||
|
- Netdata:
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/netdata.webp
|
||||||
|
href: http://192.168.178.58:19999
|
||||||
|
description: Echtzeit-Telemetrie
|
||||||
|
server: my-docker
|
||||||
|
container: netdata
|
||||||
|
widget:
|
||||||
|
type: netdata
|
||||||
|
url: http://192.168.178.58:19999
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# TAB: Home — APPS
|
||||||
|
# Unten einfache Kacheln, keine Dopplungen aus dem Hero-Bereich
|
||||||
|
# ============================================================================
|
||||||
|
- APPS:
|
||||||
|
|
||||||
|
- Immich:
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/immich.webp
|
||||||
|
href: http://kallilabcore.local:2283
|
||||||
|
description: Fotos & Videos
|
||||||
|
server: my-docker
|
||||||
|
container: immich_server
|
||||||
|
siteMonitor: http://192.168.178.58:2283
|
||||||
|
widget:
|
||||||
|
type: immich
|
||||||
|
url: http://192.168.178.58:2283
|
||||||
|
key: FjgVSrXUaHZ7cymFtd1adRpq2naz1nijTqjqxuvGbs
|
||||||
|
version: 2
|
||||||
|
|
||||||
|
- Paperless-ngx:
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/paperless-ngx.webp
|
||||||
|
href: http://kallilabcore.local:8000
|
||||||
|
description: Dokumentenarchiv
|
||||||
|
server: my-docker
|
||||||
|
container: paperless-ngx
|
||||||
|
widget:
|
||||||
|
type: paperlessngx
|
||||||
|
url: http://192.168.178.58:8000
|
||||||
|
key: 65aa6948d2a6f3ef3d403a4a0d76891e7ae82cbe
|
||||||
|
|
||||||
|
- Mealie:
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/mealie.webp
|
||||||
|
href: http://kallilabcore.local:9935
|
||||||
|
description: Rezepte & Planung
|
||||||
|
server: my-docker
|
||||||
|
container: mealie
|
||||||
|
widget:
|
||||||
|
type: mealie
|
||||||
|
url: http://192.168.178.58:9935
|
||||||
|
key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb25nX3Rva2VuIjp0cnVlLCJpZCI6IjgxY2VmODBjLTMwZDAtNDM2OS04MjY4LWJkNTRhYmNjZmQ2MyIsIm5hbWUiOiJEYXNoYm9hcmQiLCJpbnRlZ3JhdGlvbl9pZCI6ImdlbmVyaWMiLCJleHAiOjE5MzE3MDM2NDJ9.tdUSLNqmU_uz1HkVgZhnudBnafbGs-pUeY4xqeogAwc
|
||||||
|
version: 2
|
||||||
|
|
||||||
|
- Gotify:
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/gotify.webp
|
||||||
|
href: http://192.168.178.58:8088
|
||||||
|
description: Push-Benachrichtigungen
|
||||||
|
server: my-docker
|
||||||
|
container: gotify
|
||||||
|
widget:
|
||||||
|
type: gotify
|
||||||
|
url: http://192.168.178.58:8088
|
||||||
|
key: C9iOZu1HC7NnIVi
|
||||||
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
# TAB: System — Infrastruktur & Monitoring
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
- Infrastruktur:
|
|
||||||
- Traefik:
|
- Traefik:
|
||||||
icon: traefik.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/traefik.webp
|
||||||
href: https://traefik.kaleschke.info
|
href: https://traefik.kaleschke.info
|
||||||
description: Reverse Proxy und Routing
|
description: Reverse Proxy
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: traefik
|
container: traefik
|
||||||
widget:
|
widget:
|
||||||
@@ -88,9 +230,9 @@
|
|||||||
password: ichwillcocacola
|
password: ichwillcocacola
|
||||||
|
|
||||||
- Gitea:
|
- Gitea:
|
||||||
icon: gitea.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/gitea.webp
|
||||||
href: https://git.kaleschke.info
|
href: https://git.kaleschke.info
|
||||||
description: Git-Hosting und Projektverwaltung
|
description: Git-Hosting
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: gitea
|
container: gitea
|
||||||
widget:
|
widget:
|
||||||
@@ -98,307 +240,202 @@
|
|||||||
url: https://git.kaleschke.info
|
url: https://git.kaleschke.info
|
||||||
key: e0da0f8534d83d8445dd98deee1b35539c4cac01
|
key: e0da0f8534d83d8445dd98deee1b35539c4cac01
|
||||||
|
|
||||||
- Portainer:
|
|
||||||
icon: portainer.png
|
|
||||||
href: https://kallilabcore.local:9443
|
|
||||||
description: Stack- und Container-Management
|
|
||||||
server: my-docker
|
|
||||||
container: PortainerCE
|
|
||||||
widget:
|
|
||||||
type: portainer
|
|
||||||
url: https://192.168.178.58:9443
|
|
||||||
env: 1
|
|
||||||
key: ptr_OoyIiXDLUaCj5sbYzr3f2BmeBVgi+WVnZDyX1OOlvJo=
|
|
||||||
|
|
||||||
- Homepage:
|
- Homepage:
|
||||||
icon: homepage.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/homepage.webp
|
||||||
href: https://home.kaleschke.info
|
href: https://home.kaleschke.info
|
||||||
description: Zentrale Startseite für KalliLab
|
description: Startseite
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: homepage
|
container: homepage
|
||||||
ping: true
|
siteMonitor: https://home.kaleschke.info
|
||||||
|
|
||||||
|
- Dozzle:
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/dozzle.webp
|
||||||
|
href: http://kallilabcore.local:9888
|
||||||
|
description: Container-Logs
|
||||||
|
server: my-docker
|
||||||
|
container: Dozzle
|
||||||
|
siteMonitor: http://192.168.178.58:9888
|
||||||
|
|
||||||
- Tailscale:
|
- Tailscale:
|
||||||
icon: tailscale.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/tailscale.webp
|
||||||
href: https://login.tailscale.com/admin/machines
|
href: https://login.tailscale.com/admin/machines
|
||||||
description: Sichere Remote-Vernetzung
|
description: VPN-Mesh
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: Tailscale-Docker
|
container: Tailscale-Docker
|
||||||
|
|
||||||
|
- Theme Park:
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/theme-park.webp
|
||||||
|
href: http://kallilabcore.local:8009
|
||||||
|
description: UI-Themes
|
||||||
|
server: my-docker
|
||||||
|
container: theme-park
|
||||||
|
siteMonitor: http://192.168.178.58:8009
|
||||||
|
|
||||||
- DDNS Updater:
|
- DDNS Updater:
|
||||||
icon: sh-qdm12.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/ddns-updater.webp
|
||||||
description: DynDNS-Aktualisierung im Hintergrund
|
description: DynDNS
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: ddns-updater
|
container: ddns-updater
|
||||||
|
|
||||||
- DIUN:
|
- DIUN:
|
||||||
icon: docker.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/diun.webp
|
||||||
description: Benachrichtigt über neue Container-Images
|
description: Image-Alerts
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: diun
|
container: diun
|
||||||
|
|
||||||
- Dozzle:
|
|
||||||
icon: dozzle.png
|
|
||||||
href: http://kallilabcore.local:9888
|
|
||||||
description: Live-Logs für Docker-Container
|
|
||||||
server: my-docker
|
|
||||||
container: Dozzle
|
|
||||||
ping: true
|
|
||||||
|
|
||||||
- Theme Park:
|
|
||||||
icon: mdi-palette
|
|
||||||
href: http://kallilabcore.local:8009
|
|
||||||
description: Theming- und UI-Assets
|
|
||||||
server: my-docker
|
|
||||||
container: theme-park
|
|
||||||
ping: true
|
|
||||||
|
|
||||||
- Monitoring:
|
|
||||||
- Uptime Kuma:
|
|
||||||
icon: uptime-kuma.png
|
|
||||||
href: http://kallilabcore.local:3001
|
|
||||||
description: Service-Monitoring und Statusseiten
|
|
||||||
server: my-docker
|
|
||||||
container: UptimeKuma
|
|
||||||
widget:
|
|
||||||
type: uptimekuma
|
|
||||||
url: http://192.168.178.58:3001
|
|
||||||
slug: uk1_ITsgGkyd_fIWRUjkZ5V2QZI5Pd6N_rsCrvLeQ5mJ
|
|
||||||
|
|
||||||
- Netdata:
|
|
||||||
icon: netdata.png
|
|
||||||
href: http://192.168.178.58:19999
|
|
||||||
description: Echtzeit-Telemetrie für Host und Dienste
|
|
||||||
server: my-docker
|
|
||||||
container: netdata
|
|
||||||
widget:
|
|
||||||
type: netdata
|
|
||||||
url: http://192.168.178.58:19999
|
|
||||||
|
|
||||||
- Glances:
|
|
||||||
icon: glances.png
|
|
||||||
href: http://kallilabcore.local:61208
|
|
||||||
description: Host-Metriken und Prozessübersicht
|
|
||||||
server: my-docker
|
|
||||||
container: Glances
|
|
||||||
widget:
|
|
||||||
type: glances
|
|
||||||
url: http://192.168.178.58:61208
|
|
||||||
version: 4
|
|
||||||
metric: info
|
|
||||||
|
|
||||||
- Scrutiny:
|
|
||||||
icon: scrutiny.png
|
|
||||||
href: http://192.168.178.58:8080/web/dashboard
|
|
||||||
description: S.M.A.R.T.-Monitoring für Festplatten
|
|
||||||
server: my-docker
|
|
||||||
container: scrutiny
|
|
||||||
widget:
|
|
||||||
type: scrutiny
|
|
||||||
url: http://192.168.178.58:8080
|
|
||||||
|
|
||||||
- Dashdot:
|
- Dashdot:
|
||||||
icon: dashdot.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/dashdot.webp
|
||||||
href: http://kallilabcore.local:3002
|
href: http://kallilabcore.local:3002
|
||||||
description: Moderner Server-Dashboard-Überblick
|
description: Server-Dashboard
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: dashdot
|
container: dashdot
|
||||||
ping: true
|
siteMonitor: http://192.168.178.58:3002
|
||||||
|
|
||||||
- ntopng:
|
- ntopng:
|
||||||
icon: si-ntop
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/ntopng.webp
|
||||||
href: http://kallilabcore.local:3000
|
href: http://kallilabcore.local:3000
|
||||||
description: Netzwerktraffic und Flows analysieren
|
description: Netzwerktraffic
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: ntopng
|
container: ntopng
|
||||||
ping: true
|
siteMonitor: http://192.168.178.58:3000
|
||||||
|
|
||||||
- NetAlertX:
|
- NetAlertX:
|
||||||
icon: netalertx.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/netalertx.webp
|
||||||
href: http://192.168.178.58:20211
|
href: http://192.168.178.58:20211
|
||||||
description: Netzwerkgeräte erkennen und überwachen
|
description: Netzwerkgeräte
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: netalertx
|
container: netalertx
|
||||||
|
|
||||||
- Gotify:
|
- Code Server:
|
||||||
icon: gotify.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/code-server.webp
|
||||||
href: http://192.168.178.58:8088
|
href: https://code.kaleschke.info
|
||||||
description: Push-Benachrichtigungen für KalliLab
|
description: Browser-IDE
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: gotify
|
container: code-server
|
||||||
|
siteMonitor: https://code.kaleschke.info
|
||||||
|
|
||||||
# ────────────────────────────────────────────────────────
|
- Paperless-AI:
|
||||||
# TAB: Security — Netzwerk & Zugang
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/paperless-ngx.webp
|
||||||
# ────────────────────────────────────────────────────────
|
href: http://kallilabcore.local:3236
|
||||||
- Netzwerk und Sicherheit:
|
description: KI-Dokumente
|
||||||
- Pi-hole:
|
|
||||||
icon: pi-hole.png
|
|
||||||
href: http://kallilabcore.local:8543
|
|
||||||
description: Netzwerkweites DNS-Blocking
|
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: binhex-official-pihole
|
container: Paperless-AI
|
||||||
widget:
|
siteMonitor: http://192.168.178.58:3236
|
||||||
type: pihole
|
|
||||||
url: http://192.168.178.58:8543
|
- Vaultwarden:
|
||||||
version: 6
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/vaultwarden.webp
|
||||||
key: kuchen123
|
href: https://kallilabcore.taild9fcf2.ts.net:4743
|
||||||
|
description: Passwortmanager
|
||||||
|
server: my-docker
|
||||||
|
container: vaultwarden
|
||||||
|
siteMonitor: https://kallilabcore.taild9fcf2.ts.net:4743
|
||||||
|
|
||||||
- Unbound:
|
- Unbound:
|
||||||
icon: unbound.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/unbound.webp
|
||||||
description: Rekursiver DNS-Resolver
|
description: DNS-Resolver
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: unbound
|
container: unbound
|
||||||
|
|
||||||
- Vaultwarden:
|
|
||||||
icon: vaultwarden.png
|
|
||||||
href: https://kallilabcore.taild9fcf2.ts.net:4743
|
|
||||||
description: Passwortmanager für Familie und Homelab
|
|
||||||
server: my-docker
|
|
||||||
container: vaultwarden
|
|
||||||
ping: true
|
|
||||||
|
|
||||||
- Mail Archiver:
|
- Mail Archiver:
|
||||||
icon: mdi-email-fast-outline
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/mailpit.webp
|
||||||
href: http://kallilabcore.local:5000
|
href: http://kallilabcore.local:5000
|
||||||
description: Mail-Archivierung und Suche
|
description: Mail-Archiv
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: mail-archiver
|
container: mail-archiver
|
||||||
ping: true
|
siteMonitor: http://192.168.178.58:5000
|
||||||
|
|
||||||
# ────────────────────────────────────────────────────────
|
- Scanopy:
|
||||||
# TAB: Dienste — Cloud, Medien & Backups
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/paperless-ngx.webp
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
- Cloud und Produktivitaet:
|
|
||||||
- Paperless-ngx:
|
|
||||||
icon: paperless-ngx.png
|
|
||||||
href: http://kallilabcore.local:8000
|
|
||||||
description: Dokumentenarchiv und OCR
|
|
||||||
server: my-docker
|
|
||||||
container: paperless-ngx
|
|
||||||
widget:
|
|
||||||
type: paperlessngx
|
|
||||||
url: http://192.168.178.58:8000
|
|
||||||
key: 65aa6948d2a6f3ef3d403a4a0d76891e7ae82cbe
|
|
||||||
|
|
||||||
- Mealie:
|
|
||||||
icon: mealie.png
|
|
||||||
href: http://kallilabcore.local:9935
|
|
||||||
description: Rezeptverwaltung und Meal Planning
|
|
||||||
server: my-docker
|
|
||||||
container: mealie
|
|
||||||
widget:
|
|
||||||
type: mealie
|
|
||||||
url: http://192.168.178.58:9935
|
|
||||||
key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb25nX3Rva2VuIjp0cnVlLCJpZCI6IjgxY2VmODBjLTMwZDAtNDM2OS04MjY4LWJkNTRhYmNjZmQ2MyIsIm5hbWUiOiJEYXNoYm9hcmQiLCJpbnRlZ3JhdGlvbl9pZCI6ImdlbmVyaWMiLCJleHAiOjE5MzE3MDM2NDJ9.tdUSLNqmU_uz1HkVgZhnudBnafbGs-pUeY4xqeogAwc
|
|
||||||
version: 2
|
|
||||||
|
|
||||||
- Paperless-AI:
|
|
||||||
icon: mdi-file-document-edit-outline
|
|
||||||
href: http://kallilabcore.local:3236
|
|
||||||
description: KI-Auswertung für Paperless-ngx
|
|
||||||
server: my-docker
|
|
||||||
container: Paperless-AI
|
|
||||||
ping: true
|
|
||||||
|
|
||||||
- Scanopy Server:
|
|
||||||
icon: mdi-scanner
|
|
||||||
href: http://kallilabcore.local:60072
|
href: http://kallilabcore.local:60072
|
||||||
description: Scanopy Weboberfläche
|
description: Scan-Workflow
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: scanopy-server
|
container: scanopy-server
|
||||||
ping: true
|
siteMonitor: http://192.168.178.58:60072
|
||||||
|
|
||||||
|
- luckyBackup:
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/luckybackup.webp
|
||||||
|
href: http://kallilabcore.local:7675/vnc.html?autoconnect=true
|
||||||
|
description: Backup-GUI
|
||||||
|
server: my-docker
|
||||||
|
container: luckyBackup
|
||||||
|
siteMonitor: http://192.168.178.58:7675
|
||||||
|
|
||||||
- Scanopy Daemon:
|
- Scanopy Daemon:
|
||||||
icon: mdi-cog-transfer
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/paperless-ngx.webp
|
||||||
description: Hintergrunddienst für Scanopy
|
description: Hintergrunddienst
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: scanopy-daemon
|
container: scanopy-daemon
|
||||||
|
|
||||||
- luckyBackup:
|
# ============================================================================
|
||||||
icon: mdi-backup-restore
|
# TAB: Home — BACKENDS MINI
|
||||||
href: http://kallilabcore.local:7675/vnc.html?autoconnect=true
|
# ============================================================================
|
||||||
description: GUI-Backupjobs via noVNC
|
- BACKENDS MINI:
|
||||||
server: my-docker
|
|
||||||
container: luckyBackup
|
|
||||||
ping: true
|
|
||||||
|
|
||||||
- Medien:
|
|
||||||
- Immich:
|
|
||||||
icon: immich.png
|
|
||||||
href: http://kallilabcore.local:2283
|
|
||||||
description: Foto- und Videoverwaltung
|
|
||||||
server: my-docker
|
|
||||||
container: immich_server
|
|
||||||
widget:
|
|
||||||
type: immich
|
|
||||||
url: http://192.168.178.58:2283
|
|
||||||
key: FjgVSrXUaHZ7cymFtd1adRpq2naz1nijTqjqxuvGbs
|
|
||||||
version: 2
|
|
||||||
|
|
||||||
- Plex:
|
|
||||||
icon: plex.png
|
|
||||||
href: http://kallilabcore.local:32400/web
|
|
||||||
description: Medienserver für Filme und Serien
|
|
||||||
server: my-docker
|
|
||||||
container: Plex-Media-Server
|
|
||||||
widget:
|
|
||||||
type: plex
|
|
||||||
url: http://kallilabcore.local:32400
|
|
||||||
key: YOUR_PLEX_TOKEN
|
|
||||||
|
|
||||||
- Stash:
|
|
||||||
icon: stash.png
|
|
||||||
href: http://kallilabcore.local:6969
|
|
||||||
description: Medienbibliothek und Metadaten
|
|
||||||
server: my-docker
|
|
||||||
container: Stash
|
|
||||||
widget:
|
|
||||||
type: stash
|
|
||||||
url: http://kallilabcore.local:6969
|
|
||||||
key: YOUR_STASH_API_KEY
|
|
||||||
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
# TAB: Backends — Datenbanken & Worker
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
- Daten und Backends:
|
|
||||||
- PostgreSQL 17:
|
- PostgreSQL 17:
|
||||||
icon: postgres.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/postgresql.webp
|
||||||
description: Gemeinsame PostgreSQL-Instanz
|
description: Shared Postgres
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: postgresql17
|
container: postgresql17
|
||||||
|
|
||||||
- Redis:
|
- Redis:
|
||||||
icon: redis.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/redis.webp
|
||||||
description: Shared Redis für Services
|
description: Shared Cache
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: Redis
|
container: Redis
|
||||||
|
|
||||||
- Mealie Postgres:
|
- Mealie Postgres:
|
||||||
icon: postgres.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/postgresql.webp
|
||||||
description: Datenbank für Mealie
|
description: DB für Mealie
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: mealie-postgres
|
container: mealie-postgres
|
||||||
|
|
||||||
- Scanopy Postgres:
|
- Scanopy Postgres:
|
||||||
icon: postgres.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/postgresql.webp
|
||||||
description: Datenbank für Scanopy
|
description: DB für Scanopy
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: scanopy-postgres
|
container: scanopy-postgres
|
||||||
|
|
||||||
- Immich Machine Learning:
|
- Immich Machine Learning:
|
||||||
icon: immich.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/immich.webp
|
||||||
description: ML-Worker für Immich
|
description: ML für Immich
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: immich_machine_learning
|
container: immich_machine_learning
|
||||||
|
|
||||||
- Immich Postgres:
|
- Immich Postgres:
|
||||||
icon: postgres.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/postgresql.webp
|
||||||
description: Datenbank für Immich
|
description: DB für Immich
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: immich_postgres
|
container: immich_postgres
|
||||||
|
|
||||||
- Immich Redis:
|
- Immich Redis:
|
||||||
icon: redis.png
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/redis.webp
|
||||||
description: Redis-Cache für Immich
|
description: Cache für Immich
|
||||||
server: my-docker
|
server: my-docker
|
||||||
container: immich_redis
|
container: immich_redis
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# TAB: Media — MEDIA
|
||||||
|
# ============================================================================
|
||||||
|
- MEDIA:
|
||||||
|
|
||||||
|
- Plex:
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/plex.webp
|
||||||
|
href: http://kallilabcore.local:32400/web
|
||||||
|
description: Medienserver
|
||||||
|
server: my-docker
|
||||||
|
container: Plex-Media-Server
|
||||||
|
widget:
|
||||||
|
type: plex
|
||||||
|
url: http://192.168.178.58:32400
|
||||||
|
key: YOUR_PLEX_TOKEN
|
||||||
|
|
||||||
|
- Stash:
|
||||||
|
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/webp/stash.webp
|
||||||
|
href: http://kallilabcore.local:6969
|
||||||
|
description: Medienbibliothek
|
||||||
|
server: my-docker
|
||||||
|
container: Stash
|
||||||
|
widget:
|
||||||
|
type: stash
|
||||||
|
url: http://192.168.178.58:6969
|
||||||
|
key: YOUR_STASH_API_KEY
|
||||||
@@ -1,88 +1,72 @@
|
|||||||
title: KalliLab
|
title: KalliLab
|
||||||
favicon: https://home.kaleschke.info/favicon.ico
|
favicon: /images/icons/logo.png
|
||||||
|
|
||||||
|
disableCollapse: false
|
||||||
|
|
||||||
|
background:
|
||||||
|
image: /images/ay2262vnvz8c1.webp
|
||||||
|
saturate: 1
|
||||||
|
brightness: 100
|
||||||
|
opacity: 100
|
||||||
|
|
||||||
|
cardBlur: 4xl
|
||||||
theme: dark
|
theme: dark
|
||||||
color: slate
|
color: emerald
|
||||||
headerStyle: clean
|
headerStyle: underlined
|
||||||
|
iconStyle: theme
|
||||||
statusStyle: dot
|
statusStyle: dot
|
||||||
target: _blank
|
|
||||||
hideVersion: false
|
|
||||||
language: de
|
|
||||||
useEqualHeights: true
|
|
||||||
|
|
||||||
quicklaunch:
|
quicklaunch:
|
||||||
searchDescriptions: true
|
searchDescriptions: true
|
||||||
hideInternetSearch: false
|
|
||||||
showSearchSuggestions: true
|
|
||||||
|
|
||||||
background:
|
hideVersion: true
|
||||||
image: /images/background_dashboard.png
|
hideErrors: false
|
||||||
opacity: 65
|
fiveColumns: false
|
||||||
blur: 0
|
useEqualHeights: true
|
||||||
saturate: 100
|
preloadAllWidgets: true
|
||||||
brightness: 80
|
target: _blank
|
||||||
|
|
||||||
# ──────────────────────────────────────────────────────────
|
language: de
|
||||||
# WICHTIG: Emojis in Gruppen-Namen wurden entfernt.
|
customJS: /custom.js
|
||||||
# Homepage kann Emojis in Tab-Zuweisungen nicht zuverlässig
|
|
||||||
# verarbeiten — Sonderzeichen führen zu Rendering-Bugs.
|
|
||||||
# Das CSS adressiert die Gruppen weiterhin korrekt via
|
|
||||||
# data-name Attribut (ohne Emoji).
|
|
||||||
# ──────────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
layout:
|
layout:
|
||||||
|
SYSTEM TELEMETRY:
|
||||||
# ── TAB 1: Tägliche Arbeitsoberfläche ──
|
header: false
|
||||||
"Control Center":
|
tab: Home
|
||||||
tab: "Uebersicht"
|
|
||||||
style: row
|
|
||||||
columns: 3
|
|
||||||
|
|
||||||
# Bookmarks auf Tab 1 (aus bookmarks.yaml)
|
|
||||||
"Dokumentation":
|
|
||||||
tab: "Uebersicht"
|
|
||||||
style: row
|
|
||||||
columns: 3
|
|
||||||
|
|
||||||
"KalliLab":
|
|
||||||
tab: "Uebersicht"
|
|
||||||
style: row
|
|
||||||
columns: 3
|
|
||||||
|
|
||||||
"Admin & Remote":
|
|
||||||
tab: "Uebersicht"
|
|
||||||
style: row
|
|
||||||
columns: 3
|
|
||||||
|
|
||||||
# ── TAB 2: Infrastruktur & Monitoring ──
|
|
||||||
"Infrastruktur":
|
|
||||||
tab: "System"
|
|
||||||
style: row
|
style: row
|
||||||
columns: 4
|
columns: 4
|
||||||
|
|
||||||
"Monitoring":
|
STORAGE & I/O:
|
||||||
tab: "System"
|
header: false
|
||||||
|
tab: Home
|
||||||
style: row
|
style: row
|
||||||
columns: 4
|
columns: 4
|
||||||
|
|
||||||
# ── TAB 3: Netzwerk & Zugang ──
|
CORE SERVICES:
|
||||||
"Netzwerk und Sicherheit":
|
header: false
|
||||||
tab: "Security"
|
tab: Home
|
||||||
style: row
|
|
||||||
columns: 3
|
|
||||||
|
|
||||||
# ── TAB 4: Cloud, Produktivität & Medien ──
|
|
||||||
"Cloud und Produktivitaet":
|
|
||||||
tab: "Dienste"
|
|
||||||
style: row
|
style: row
|
||||||
columns: 4
|
columns: 4
|
||||||
|
|
||||||
"Medien":
|
APPS:
|
||||||
tab: "Dienste"
|
header: false
|
||||||
|
tab: Home
|
||||||
style: row
|
style: row
|
||||||
columns: 3
|
columns: 6
|
||||||
|
|
||||||
# ── TAB 5: Datenbanken & Worker ──
|
BACKENDS MINI:
|
||||||
"Daten und Backends":
|
header: false
|
||||||
tab: "Backends"
|
tab: Home
|
||||||
style: row
|
style: row
|
||||||
columns: 4
|
columns: 4
|
||||||
|
|
||||||
|
MEDIA:
|
||||||
|
header: false
|
||||||
|
tab: Media
|
||||||
|
style: row
|
||||||
|
columns: 4
|
||||||
|
|
||||||
|
tabs:
|
||||||
|
- name: Home
|
||||||
|
initialTab: true
|
||||||
|
- name: Media
|
||||||
@@ -1,28 +1,52 @@
|
|||||||
# KalliLab Homepage widgets.yaml
|
- logo:
|
||||||
|
icon: /images/icons/logo.png
|
||||||
|
href: https://home.kaleschke.info
|
||||||
|
target: _blank
|
||||||
|
|
||||||
- greeting:
|
- greeting:
|
||||||
text_size: xl
|
text_size: 3xl
|
||||||
text: KalliLab
|
text: KalliLab
|
||||||
|
href: https://home.kaleschke.info
|
||||||
- resources:
|
|
||||||
label: System
|
|
||||||
cpu: true
|
|
||||||
memory: true
|
|
||||||
cputemp: true
|
|
||||||
uptime: true
|
|
||||||
network: true
|
|
||||||
refresh: 3000
|
|
||||||
|
|
||||||
- search:
|
|
||||||
provider: duckduckgo
|
|
||||||
focus: true
|
|
||||||
showSearchSuggestions: true
|
|
||||||
target: _blank
|
target: _blank
|
||||||
|
|
||||||
- datetime:
|
- datetime:
|
||||||
locale: de-DE
|
locale: de-DE
|
||||||
text_size: xl
|
text_size: 3xl
|
||||||
format:
|
format:
|
||||||
dateStyle: medium
|
dateStyle: full
|
||||||
|
hour12: false
|
||||||
timeStyle: short
|
timeStyle: short
|
||||||
hourCycle: h23
|
|
||||||
|
# Jede Metrik = eigener Block = alle nebeneinander
|
||||||
|
- resources:
|
||||||
|
cpu: true
|
||||||
|
|
||||||
|
- resources:
|
||||||
|
memory: true
|
||||||
|
|
||||||
|
- resources:
|
||||||
|
cputemp: true
|
||||||
|
units: metric
|
||||||
|
|
||||||
|
- resources:
|
||||||
|
uptime: true
|
||||||
|
|
||||||
|
- resources:
|
||||||
|
label: KalliLab
|
||||||
|
disk: /
|
||||||
|
href: http://kallilabcore.local:61208
|
||||||
|
target: _blank
|
||||||
|
|
||||||
|
- search:
|
||||||
|
provider: google
|
||||||
|
focus: false
|
||||||
|
target: _blank
|
||||||
|
|
||||||
|
- openmeteo:
|
||||||
|
label: KalliLab
|
||||||
|
latitude: 52.1497
|
||||||
|
longitude: 7.5205
|
||||||
|
units: metric
|
||||||
|
cache: 5
|
||||||
|
format:
|
||||||
|
maximumFractionDigits: 1
|
||||||