6 | }
--------------------------------------------------------------------------------
/web/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { clsx, type ClassValue } from "clsx"
2 | import { twMerge } from "tailwind-merge"
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs))
6 | }
7 |
--------------------------------------------------------------------------------
/web/src/info/home-assistant.md:
--------------------------------------------------------------------------------
1 | # Home Assistant
2 | [Home Assistant](https://www.home-assistant.io/) is a home automation platform that has many integrations. It can be used to control lights, fans, thermostats, cameras, and many other devicesn
3 |
--------------------------------------------------------------------------------
/web/src/components/code/index.tsx:
--------------------------------------------------------------------------------
1 | export default function(props: {
2 | children: any
3 | }) {
4 | return
5 |
6 | {props.children}
7 |
8 |
;
9 | }
--------------------------------------------------------------------------------
/web/src/info/longhorn.md:
--------------------------------------------------------------------------------
1 | [Longhorn](https://longhorn.io/) is an open-source, distributed block storage system for Kubernetes. It provides a fast and reliable solution for persistent storage, making it an ideal choice for a wide range of use cases, including stateful applications, databases, and more.
--------------------------------------------------------------------------------
/web/src/info/metallb.md:
--------------------------------------------------------------------------------
1 | [metallb](https://metallb.universe.tf/) is a load-balancer implementation for Kubernetes, allowing you to create services with `type: LoadBalancer`. With BGP, you can setup IP ranges in your network that get assigned to k8s services. You can use IP addresses that are assigned to you, and share them amongst services.
2 |
--------------------------------------------------------------------------------
/web/src/info/cert-manager.md:
--------------------------------------------------------------------------------
1 | [cert-manager](https://cert-manager.io/) is a certificate management controller for Kubernetes. It automates the management and issuance of TLS certificates from various issuing sources. It will ensure certificates are valid and up to date periodically, and attempt to renew certificates at an appropriate time before expiry.
--------------------------------------------------------------------------------
/web/src/info/kured.md:
--------------------------------------------------------------------------------
1 | Kured (Kubernetes REboot Daemon) is a Kubernetes add-on that automates the process of rebooting nodes in your cluster. It integrates with the underlying operating system's package management system to identify when a reboot is necessary, and performs the reboot in a safe and controlled manner to minimize disruption to your applications.
2 |
--------------------------------------------------------------------------------
/web/src/info/authelia.md:
--------------------------------------------------------------------------------
1 | [Authelia](https://www.authelia.com) is an open-source authentication and authorization server and portal fulfilling the identity and access management (IAM) role of information security in providing multi-factor authentication and single sign-on (SSO) for your applications via a web portal. It acts as a companion for common reverse proxies.
2 |
--------------------------------------------------------------------------------
/web/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "emitDeclarationOnly": true,
4 | "declaration": true,
5 | "outDir": "dist/server",
6 | "esModuleInterop": true,
7 | "jsx": "react-jsx",
8 | "module": "CommonJS",
9 |
10 | "moduleResolution": "Node",
11 | },
12 | "include": ["src/entry-server.tsx"]
13 | }
--------------------------------------------------------------------------------
/web/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import react from '@vitejs/plugin-react-swc'
3 | import path from 'node:path'
4 |
5 |
6 | // https://vitejs.dev/config/
7 | export default defineConfig({
8 | plugins: [
9 | react()],
10 |
11 | resolve: {
12 | alias: {
13 | "@": path.resolve(__dirname, "./src"),
14 | },
15 | },
16 | })
17 |
--------------------------------------------------------------------------------
/web/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 | **/playwright-report/
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | **/node_modules/
2 | **/.*cache/
3 | **/dist/
4 | **/public/repos.db
5 | **/public/*wasm*
6 | repos*.db*
7 | repos/
8 | .venv/
9 | .direnv/
10 | **/__pycache__/
11 | sqljs-worker-wasm.zip
12 | .DS_Store
13 | frontend/cypress/videos/
14 | frontend/cypress/screenshots/
15 | .devenv*
16 | devenv.local.nix
17 | .pre-commit-config.yaml
18 | result
19 | yarn-error.log
20 | web/test-results/**/*
21 |
--------------------------------------------------------------------------------
/web/src/info/descheduler.md:
--------------------------------------------------------------------------------
1 | [descheduler](https://github.com/kubernetes-sigs/descheduler) is a Kubernetes add-on that helps optimize resource utilization and clean up unused resources in your cluster. It works by identifying and rescheduling pods that are running on underutilized nodes to more suitable nodes, freeing up resources for other pods to use. This helps to improve the overall performance of your cluster and reduce waste.
--------------------------------------------------------------------------------
/web/src/components/icon/index.tsx:
--------------------------------------------------------------------------------
1 | import { Icon as IconifyIcon } from '@iconify/react';
2 |
3 | export default function Icon(props: { icon?: string }) {
4 | const name = (!props.icon?.includes(":") ? "mdi:" : "") + props.icon;
5 | return (
6 |
7 | {props.icon && }
8 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/web/src/info/redis.md:
--------------------------------------------------------------------------------
1 | [Redis](https://redis.io/) is an open-source, in-memory data structure store that is used as a database, cache, and message broker. It provides a fast and flexible solution for storing and retrieving data, making it an ideal choice for a wide range of use cases, including real-time analytics, session management, and more.
2 |
3 | Redis is used by [Authentik](/#authentik), [Authelia](/#authelia), [oauth2-proxy](/#oauth2-proxy).
--------------------------------------------------------------------------------
/web/src/info/loki.md:
--------------------------------------------------------------------------------
1 | [Loki](https://grafana.com/oss/loki/) is a log aggregation system that aggregates logs from various sources, such as Kubernetes, and makes them available for search and analysis. It uses a label-based approach to categorize logs, making it easy to query and retrieve relevant logs. The system is designed to be horizontally scalable, highly available, and multi-tenant, making it suitable for use in a variety of environments, including home labs.
--------------------------------------------------------------------------------
/web/src/info/kyverno.md:
--------------------------------------------------------------------------------
1 | [Kyverno](https://kyverno.io/) is a policy engine for Kubernetes that enables you to define and enforce policies for your cluster resources. It provides a flexible and scalable solution for managing your cluster configuration, allowing you to enforce best practices, prevent misconfigurations, and enforce compliance requirements.
2 |
3 | The [kyverno/policies](https://github.com/kyverno/policies) offer all kinds of security and best practice policies that you could use.
--------------------------------------------------------------------------------
/web/src/info/snmp-exporter-dell-idrac.md:
--------------------------------------------------------------------------------
1 | To monitor Dell iDRAC devices with Prometheus, you can use the [SNMP Exporter](https://github.com/prometheus/snmp_exporter) and use it with the `snmp.yml` configuration file.
2 |
3 | Below you can find other users from our community that have already configured the SNMP Exporter for Dell iDRAC devices. Click on their repository links to see their helm release and in the same directory you should find a config map with the `snmp.yml` configuration file.
--------------------------------------------------------------------------------
/web/src/info/hajimari.md:
--------------------------------------------------------------------------------
1 | [Hajimari](https://hajimari.io/charts/hajimari/) is a versatile and customizable browser startpage designed specifically for Kubernetes users. It provides a beautiful and user-friendly interface that makes it easy to discover and launch applications running in your home lab. With Hajimari, you can quickly access all of your favorite applications and services, including those deployed on your cluster, without having to remember complex URLs or navigate through multiple tabs.
--------------------------------------------------------------------------------
/web/src/entry-server.tsx:
--------------------------------------------------------------------------------
1 | import ReactDOMServer from 'react-dom/server'
2 | import { StaticRouter } from 'react-router-dom/server'
3 | import App, { AppData } from './App'
4 |
5 |
6 |
7 | export function render(url: string, appData: AppData, pageData: any) {
8 | return ReactDOMServer.renderToString(
9 |
10 |
11 | ,
12 | )
13 | }
14 |
15 | export type RenderFunction = typeof render;
--------------------------------------------------------------------------------
/web/src/info/vpa.md:
--------------------------------------------------------------------------------
1 | [Kubernetes Vertical Pod Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler) (VPA) is a Kubernetes feature that enables automatic scaling of resources for individual pods in a cluster. It works by analyzing resource usage data for pods and adjusting their resource requests and limits to optimize resource utilization. This helps to ensure that your applications have the resources they need to run effectively, while also reducing waste and improving overall cluster efficiency.
--------------------------------------------------------------------------------
/web/src/info/cilium.md:
--------------------------------------------------------------------------------
1 | [Cilium](https://cilium.io/) is a networking, security, and observability solution for Kubernetes, built on eBPF. It provides high-performance networking with support for Layer 3-7 policies, load balancing, and transparent encryption. With Cilium, you can enforce fine-grained security policies, observe network flows in real time, and integrate seamlessly with service meshes. It also offers eBPF-powered network policies and cluster mesh capabilities, enabling secure communication across multiple Kubernetes clusters.
2 |
--------------------------------------------------------------------------------
/web/src/info/snapshot-controller.md:
--------------------------------------------------------------------------------
1 | [Snapshot Controller](https://github.com/piraeusdatastore/helm-charts/tree/main/charts/snapshot-controller) deploys the **Kubernetes snapshot-controller**, a required component for **CSI volume snapshotting**. It manages the lifecycle of **VolumeSnapshots**, enabling the creation, listing, and deletion of snapshots. The controller is **CSI-agnostic**, meaning it works with any **CSI driver** that supports the snapshot API, providing a standardized way to handle persistent volume snapshots in Kubernetes clusters.
2 |
--------------------------------------------------------------------------------
/web/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "default",
4 | "rsc": false,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "tailwind.config.cjs",
8 | "css": "src/index.css",
9 | "baseColor": "gray",
10 | "cssVariables": true,
11 | "prefix": ""
12 | },
13 | "aliases": {
14 | "components": "@/components",
15 | "utils": "@/lib/utils",
16 | "ui": "@/components/ui",
17 | "lib": "@/lib",
18 | "hooks": "@/hooks"
19 | },
20 | "iconLibrary": "lucide"
21 | }
--------------------------------------------------------------------------------
/web/src/info/cloudflared.md:
--------------------------------------------------------------------------------
1 | [Cloudflared](https://github.com/cloudflare/cloudflared) is a lightweight proxy client for securely connecting applications to Cloudflare’s network. It powers **Cloudflare Tunnel**, allowing services to be exposed without opening ports or configuring firewall rules. `cloudflared` routes traffic through Cloudflare’s global network, enhancing security with DDoS protection, authentication, and encrypted connections. It supports **HTTP, TCP, and QUIC**, making it ideal for self-hosted services, remote access, and **zero-trust networking**.
2 |
--------------------------------------------------------------------------------
/web/src/info/external-dns.md:
--------------------------------------------------------------------------------
1 | [ExternalDNS](https://github.com/kubernetes-sigs/external-dns) is a Kubernetes add-on that automatically manages the creation and updates of DNS records for services running in your cluster. It integrates with a variety of DNS providers, such as CloudFlare DNS, Amazon Route 53, Google Cloud DNS, and more, to ensure that your applications are easily accessible from anywhere with a DNS name. With ExternalDNS, you can simplify the process of managing DNS records for your home lab, eliminating the need for manual updates and reducing the risk of errors.
--------------------------------------------------------------------------------
/web/src/info/external-secrets.md:
--------------------------------------------------------------------------------
1 | [External Secrets](https://external-secrets.io/) is a Kubernetes operator that synchronizes secrets from **external secret management systems** (e.g., AWS Secrets Manager, HashiCorp Vault, Google Secret Manager, 1Password) into Kubernetes secrets. It ensures that sensitive data stays outside the cluster while being securely referenced within applications. **External Secrets** supports **automatic synchronization, templating, and multi-backend integration**, making it a scalable and secure solution for managing secrets in Kubernetes environments.
2 |
--------------------------------------------------------------------------------
/web/src/info/grafana.md:
--------------------------------------------------------------------------------
1 | [Grafana](https://grafana.com/) is an open-source data visualization and monitoring platform that provides support for various data sources such as Prometheus, InfluxDB, and Elasticsearch. It offers a wide range of customizable dashboards and panels that can be used to display and analyze data in real-time. Whether you are looking to monitor the performance of your home lab or simply want to visualize your data in a more meaningful way, Grafana has you covered. With its intuitive user interface and powerful visualization capabilities, it is a must-have tool for any home Kubernetes user.
--------------------------------------------------------------------------------
/web/tsconfig.prerender.json:
--------------------------------------------------------------------------------
1 | {
2 |
3 | "compilerOptions": {
4 | "lib": ["es2021"],
5 | "module": "commonjs",
6 | "target": "es2021",
7 |
8 | "strict": true,
9 | "esModuleInterop": true,
10 | "skipLibCheck": true,
11 | "forceConsistentCasingInFileNames": true,
12 | "moduleResolution": "node"
13 | },
14 | "include": ["src/**/*", "types/*", "server.ts", "node_modules/vite/types/*"],
15 | "ts-node": {
16 | "transpileOnly": true,
17 | "files": true,
18 | "esm": true,
19 | "compilerOptions": {
20 | "module": "CommonJS"
21 | }
22 | }
23 | }
--------------------------------------------------------------------------------
/web/src/info/k8s-gateway.md:
--------------------------------------------------------------------------------
1 | [k8s_gateway](https://github.com/k8s-gateway/k8s_gateway) is a CoreDNS plugin that resolves all types of external Kubernetes resources.
2 |
3 | It will gather all domains from all services, ingresses, and HTTPRoutes resources and create a DNS record for each of them, corresponding to the service IPs. This ensures that all external resources are resolved from within the cluster, and traffic is not leaving the cluster.
4 |
5 | Most people deploy the k8s_gateway together with CoreDNS and call the Helm Release 'k8s-gateway'. This can be supplimenting along side the kube-dns or default CoreDNS from k3s.
6 |
--------------------------------------------------------------------------------
/web/src/info/goldilocks.md:
--------------------------------------------------------------------------------
1 | [Golidlocks](https://github.com/FairwindsOps/goldilocks) is an open-source project that provides a set of tools and resources for optimizing resource requests and limits in Kubernetes. It works by analyzing resource usage data for your pods and comparing it against the defined resource requests and limits. This allows you to identify resources that are over-allocated or under-allocated, and make adjustments to optimize resource utilization. With Goldilocks, you can improve the performance and efficiency of your home lab, reduce waste, and ensure that your applications have the resources they need to run effectively.
--------------------------------------------------------------------------------
/init-db.py:
--------------------------------------------------------------------------------
1 | import sqlite3
2 | import json
3 | # create sqlite db
4 | conn = sqlite3.connect('repos.db')
5 | c = conn.cursor()
6 | # create table if not exists
7 | # table name: repos
8 | # fields: repo name, url, stars
9 | # primary key repo_name
10 | c.execute('''CREATE TABLE IF NOT EXISTS repo
11 | (repo_name text primary key, url text, branch text, stars integer)''')
12 | c.execute('''delete from repo''')
13 | results = json.loads(open('repos.json').read())
14 | for (repo_name, url, branch, stars) in results:
15 | c.execute("INSERT OR REPLACE INTO repo VALUES (?, ?, ?, ?)", (repo_name, url, branch, stars))
16 | conn.commit()
--------------------------------------------------------------------------------
/web/src/info/thanos.md:
--------------------------------------------------------------------------------
1 | [Thanos](https://thanos.io/) is an open-source project that provides a highly available and horizontally scalable way to store and query time-series data in a Kubernetes cluster. It integrates with popular time-series databases, such as Prometheus, to provide a unified view of your monitoring and logging data. Thanos also provides features such as data compression and deduplication, making it an efficient solution for storing large amounts of time-series data. With Thanos, you can easily store, query, and analyze your home lab's monitoring and logging data, providing valuable insights into the performance and health of your applications.
--------------------------------------------------------------------------------
/web/src/info/traefik.md:
--------------------------------------------------------------------------------
1 | [Traefik](https://doc.traefik.io/traefik/) is a HTTP reverse proxy and load balancer for microservices. It integrates with popular orchestration systems, such as Kubernetes, to provide seamless and automatic service discovery, load balancing, and proxying for your applications. Traefik is designed to be fast, efficient, and easy to use, making it a good solution for home lab environments. With Traefik, you can expose your applications to the internet with ease, providing remote access to your services from anywhere. Whether you're looking to host a personal website, run a web-based service, or simply provide external access to your applications.
--------------------------------------------------------------------------------
/web/src/info/volsync.md:
--------------------------------------------------------------------------------
1 | [VolSync](https://github.com/backube/volsync) is a Kubernetes operator for **asynchronous data replication and backup** of persistent volumes. It enables efficient synchronization between storage locations using **rsync, restic, or Rclone**, making it ideal for **backups, disaster recovery, and data migration** across clusters.
2 |
3 | ### **How It Works**
4 | VolSync automates **snapshot-based or file-based** replication of PVCs, supporting:
5 | - **Local backups** (e.g., to another PVC or storage backend)
6 | - **Remote replication** (e.g., across Kubernetes clusters)
7 | - **Incremental synchronization** to optimize storage and bandwidth usage
8 |
--------------------------------------------------------------------------------
/web/public/opensearch.xml:
--------------------------------------------------------------------------------
1 |
3 | kubesearch.dev
4 | Your Gateway Drug to Kubernetes!
5 | [UTF-8]
6 | https://kubesearch.dev/k8s-search.svg
7 |
8 |
9 | [https://kubesearch.dev/]
10 |
11 |
--------------------------------------------------------------------------------
/web/src/info/ingress-nginx.md:
--------------------------------------------------------------------------------
1 | [ingress-nginx](https://github.com/kubernetes/ingress-nginx) is a popular Kubernetes Ingress controller that provides external access to your applications running in a cluster. It acts as a reverse proxy and load balancer, routing incoming requests to the appropriate backend service based on URL paths and host names. With ingress-nginx, you can easily expose your home lab applications to the internet, allowing you to access them from anywhere with a web browser. Whether you're looking to run a web-based service, host a personal website, or simply want to provide remote access to your applications, ingress-nginx provides a simple and flexible solution for managing external access to your cluster.
--------------------------------------------------------------------------------
/web/e2e/wordcloud.spec.ts:
--------------------------------------------------------------------------------
1 | import { test, expect } from '@playwright/test';
2 |
3 | test('test wordcloud', async ({ page }) => {
4 | await page.goto('.');
5 |
6 | await page.waitForSelector('"cert-manager"');
7 |
8 | // there should only be one link with the text "cert-manager",
9 | // so any errors suggesting that there are multiple links with
10 | // the same text suggests there is a bug in the wordcloud
11 | await page.getByRole('link', { name: 'cert-manager' }).first().click();
12 | await expect(page).toHaveURL('/hr/charts.jetstack.io-cert-manager');
13 |
14 | const rows = page.locator('table tbody tr');
15 | for (let i = 0; i < 5; i++) {
16 | await expect(rows).not.toHaveCount(i);
17 | }
18 |
19 | });
20 |
21 |
--------------------------------------------------------------------------------
/web/src/info/kube-prometheus-stack.md:
--------------------------------------------------------------------------------
1 | [kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) is a Helm collection that deploys:
2 | - [Grafana](https://grafana.com/grafana/) for dashboarding
3 | - [Prometheus](https://prometheus.io/) as metric database, together with an operator to manage it.
4 | - [kube-state-metrics](https://github.com/kubernetes/kube-state-metrics) for exposing k8s metrics
5 | - [prometheus-node-exporter](https://github.com/prometheus/node_exporter) for exposing node metrics
6 | - [alertmanager](https://github.com/prometheus/alertmanager) for setting up alerts based on metrics or logs
7 |
8 | Overall, kube-prometheus-stack is comperehensive and heavily configures all the tools.
9 |
--------------------------------------------------------------------------------
/web/src/info/metrics-server.md:
--------------------------------------------------------------------------------
1 | [Metrics Server](https://github.com/kubernetes-sigs/metrics-server) is a crucial component of a Kubernetes cluster, responsible for collecting resource usage and performance metrics from the nodes and pods. It provides a centralized and scalable solution for retrieving cluster-wide metrics, which is essential for monitoring the health and performance of your home lab. With Metrics Server, you can easily track the utilization of resources such as CPU, memory, and network bandwidth, allowing you to identify bottlenecks and make informed decisions about scaling and resource allocation. Whether you're looking to optimize resource utilization or simply monitor the health of your cluster, Metrics Server is a must-have tool for any home Kubernetes user.
--------------------------------------------------------------------------------
/web/src/info/emqx.md:
--------------------------------------------------------------------------------
1 | [EMQX](https://www.emqx.io/) is a scalable, open-source MQTT message broker that enables you to build and manage real-time IoT systems and applications.
2 |
3 | MQTT is a lightweight communication protocol for connecting devices and applications, making it an ideal solution for IoT and machine-to-machine (M2M) communication.
4 |
5 | Whether you're looking to build a smart home system, implement a remote monitoring solution, or simply want to connect your devices and applications, EMQ X is a powerful and flexible tool for your MQTT needs.
6 |
7 | Popular home applications that support MQTT are:
8 |
9 | - [Home Assistant](#/home-assistant)
10 | - [ESPHome](#/esphome)
11 | - [Zigbee2MQTT](#/zigbee2mqtt)
12 | - [ZWaveJS2MQTT](#/zwavejs2mqtt)
13 | - [NodeRED](#/node-red)
--------------------------------------------------------------------------------
/download.py:
--------------------------------------------------------------------------------
1 | from re import sub
2 | import subprocess
3 | import sqlite3
4 |
5 | def bash_command(cmd):
6 | subprocess.Popen(['bash', '-c', cmd])
7 |
8 | conn = sqlite3.connect('repos.db')
9 | c = conn.cursor()
10 | c.execute("""
11 | SELECT
12 | replace(repo_name, '/', '-') as dir_name,
13 | branch,
14 | url
15 | FROM repo
16 | """)
17 | repos = c.fetchall()
18 |
19 | # mkdir repos
20 | subprocess.run(['mkdir', 'repos'])
21 |
22 | for repo in repos:
23 | dir_name, branch, url = repo
24 | print("downloading "+dir_name+" "+branch+" "+url)
25 | # max 1 year
26 | bash_command(f'rm -rf repos/{dir_name}; git clone {url} repos/{dir_name} --branch {branch} --filter=blob:limit=1m --single-branch --shallow-since="1 year"')
27 |
28 | print('')
29 | print('')
30 |
31 | print("done")
32 |
--------------------------------------------------------------------------------
/web/src/info/rook-ceph-cluster.md:
--------------------------------------------------------------------------------
1 | [Rook Ceph Cluster](https://rook.io/docs/rook/latest-release/) is a Kubernetes operator for deploying and managing [Ceph](https://docs.ceph.com/) storage clusters. Ceph is a distributed storage system that provides block, object, and file storage for your home lab, and Rook makes it easy to deploy and manage Ceph storage clusters on top of Kubernetes. This allows you to store and access your data from anywhere in the cluster, such pods are not stuck to a single node, like with local-path storage.
2 |
3 | With [Ceph Block devices](https://docs.ceph.com/en/latest/rbd/rbd-kubernetes/) you can use Ceph as a persistent storage solution for your Kubernetes cluster. You can create a storage class that will automatically provision a Ceph block device for your pods.
4 |
5 | For Rook Ceph cluster, you need to have deployed the [Rook Ceph Operator](./charts.rook.io-release-rook-ceph-rook-ceph-operator) first.
--------------------------------------------------------------------------------
/web/src/info/rook-ceph-operator.md:
--------------------------------------------------------------------------------
1 | [Rook Ceph](https://rook.io/docs/rook/) is a Kubernetes operator that can be used to manage [Ceph](https://docs.ceph.com/) storage clusters on Kubernetes. Ceph is a distributed storage system that provides block, object, and file storage for your home lab, and Rook makes it easy to deploy and manage Ceph storage clusters on top of Kubernetes. This allows you to store and access your data from anywhere in the cluster, such pods are not stuck to a single node, like with local-path storage.
2 |
3 | With [Ceph Block devices](https://docs.ceph.com/en/latest/rbd/rbd-kubernetes/) you can use Ceph as a persistent storage solution for your Kubernetes cluster. You can create a storage class that will automatically provision a Ceph block device for your pods.
4 |
5 | After deploying the operator, you can deploy Rook Ceph clusters via the [Rook Ceph Cluster](./charts.rook.io-release-rook-ceph-cluster) chart.
--------------------------------------------------------------------------------
/web/src/info/rook-ceph.md:
--------------------------------------------------------------------------------
1 | [Rook Ceph](https://rook.io/docs/rook/) is a Kubernetes operator that can be used to manage [Ceph](https://docs.ceph.com/) storage clusters on Kubernetes. Ceph is a distributed storage system that provides block, object, and file storage for your home lab, and Rook makes it easy to deploy and manage Ceph storage clusters on top of Kubernetes. This allows you to store and access your data from anywhere in the cluster, such pods are not stuck to a single node, like with local-path storage.
2 |
3 | With [Ceph Block devices](https://docs.ceph.com/en/latest/rbd/rbd-kubernetes/) you can use Ceph as a persistent storage solution for your Kubernetes cluster. You can create a storage class that will automatically provision a Ceph block device for your pods.
4 |
5 | **Note:** Most people release deploy the operator with the name [rook-ceph-operator](./charts.rook.io-release-rook-ceph-rook-ceph-operator) and the cluster with [rook-ceph-cluster](./charts.rook.io-release-rook-ceph-cluster).
--------------------------------------------------------------------------------
/web/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
17 |
18 | kubesearch
19 |
20 |
21 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/web/src/info/immich-server.md:
--------------------------------------------------------------------------------
1 | [Immich](https://github.com/immich-app/immich) is a self-hosted photo and video backup solution.
2 |
3 | For immich, there are multiple helm deployments:
4 |
5 | - [immich-web](./bjw-s.github.io-helm-charts-app-template-immich-web)
6 | - [**immich-server**](./bjw-s.github.io-helm-charts-app-template-immich-server) **(this one)**
7 | - [immich-typesense](./bjw-s.github.io-helm-charts-app-template-immich-typesense)
8 | - [immich-machine-learning](./bjw-s.github.io-helm-charts-app-template-immich-machine-learning)
9 | - [immich-microservices](./bjw-s.github.io-helm-charts-app-template-immich-microservices)
10 |
11 | For redis and postgres, there are multiple helm charts:
12 | - Redis: [app-template/redis](./bjw-s.github.io-helm-charts-app-template-immich-redis), [bitnami/redis](./charts.bitnami.com-bitnami-redis)
13 | - PostgreSQL: operator [cloudnative-pg/cloudnative-pg](./cloudnative-pg.github.io-charts-cloudnative-pg-postgres), bitnami [bitnami/postgresql](./charts.bitnami.com-bitnami-postgresql)
--------------------------------------------------------------------------------
/web/src/info/immich-web.md:
--------------------------------------------------------------------------------
1 | [Immich](https://github.com/immich-app/immich) is a self-hosted photo and video backup solution.
2 |
3 | For immich, there are multiple helm deployments:
4 |
5 | - [**immich-web**](./bjw-s.github.io-helm-charts-app-template-immich-web) **(this one)**
6 | - [immich-server](./bjw-s.github.io-helm-charts-app-template-immich-server)
7 | - [immich-typesense](./bjw-s.github.io-helm-charts-app-template-immich-typesense)
8 | - [immich-machine-learning](./bjw-s.github.io-helm-charts-app-template-immich-machine-learning)
9 | - [immich-microservices](./bjw-s.github.io-helm-charts-app-template-immich-microservices)
10 |
11 | For redis and postgres, there are multiple helm charts:
12 | - Redis: [app-template/redis](./bjw-s.github.io-helm-charts-app-template-immich-redis), [bitnami/redis](./charts.bitnami.com-bitnami-redis)
13 | - PostgreSQL: operator [cloudnative-pg/cloudnative-pg](./cloudnative-pg.github.io-charts-cloudnative-pg-postgres), bitnami [bitnami/postgresql](./charts.bitnami.com-bitnami-postgresql)
--------------------------------------------------------------------------------
/web/src/info/immich-typesense.md:
--------------------------------------------------------------------------------
1 | [Immich](https://github.com/immich-app/immich) is a self-hosted photo and video backup solution.
2 |
3 | For immich, there are multiple helm deployments:
4 |
5 | - [immich-web](./bjw-s.github.io-helm-charts-app-template-immich-web)
6 | - [immich-server](./bjw-s.github.io-helm-charts-app-template-immich-server)
7 | - [**immich-typesense**](./bjw-s.github.io-helm-charts-app-template-immich-typesense) **(this one)**
8 | - [immich-machine-learning](./bjw-s.github.io-helm-charts-app-template-immich-machine-learning)
9 | - [immich-microservices](./bjw-s.github.io-helm-charts-app-template-immich-microservices)
10 |
11 | For redis and postgres, there are multiple helm charts:
12 | - Redis: [app-template/redis](./bjw-s.github.io-helm-charts-app-template-immich-redis), [bitnami/redis](./charts.bitnami.com-bitnami-redis)
13 | - PostgreSQL: operator [cloudnative-pg/cloudnative-pg](./cloudnative-pg.github.io-charts-cloudnative-pg-postgres), bitnami [bitnami/postgresql](./charts.bitnami.com-bitnami-postgresql)
--------------------------------------------------------------------------------
/web/src/info/immich-machine-learning.md:
--------------------------------------------------------------------------------
1 | [Immich](https://github.com/immich-app/immich) is a self-hosted photo and video backup solution.
2 |
3 | For immich, there are multiple helm deployments:
4 |
5 | - [immich-web](./bjw-s.github.io-helm-charts-app-template-immich-web)
6 | - [immich-server](./bjw-s.github.io-helm-charts-app-template-immich-server)
7 | - [immich-typesense](./bjw-s.github.io-helm-charts-app-template-immich-typesense)
8 | - [**immich-machine-learning**](./bjw-s.github.io-helm-charts-app-template-immich-machine-learning) **(this one)**
9 | - [immich-microservices](./bjw-s.github.io-helm-charts-app-template-immich-microservices)
10 |
11 | For redis and postgres, there are multiple helm charts:
12 | - Redis: [app-template/redis](./bjw-s.github.io-helm-charts-app-template-immich-redis), [bitnami/redis](./charts.bitnami.com-bitnami-redis)
13 | - PostgreSQL: operator [cloudnative-pg/cloudnative-pg](./cloudnative-pg.github.io-charts-cloudnative-pg-postgres), bitnami [bitnami/postgresql](./charts.bitnami.com-bitnami-postgresql)
--------------------------------------------------------------------------------
/web/src/info/immich-microservices.md:
--------------------------------------------------------------------------------
1 | [Immich](https://github.com/immich-app/immich) is a self-hosted photo and video backup solution.
2 |
3 | For immich, there are multiple helm deployments:
4 |
5 | - [immich-web](./bjw-s.github.io-helm-charts-app-template-immich-web)
6 | - [immich-server](./bjw-s.github.io-helm-charts-app-template-immich-server)
7 | - [immich-typesense](./bjw-s.github.io-helm-charts-app-template-immich-typesense)
8 | - [immich-machine-learning](./bjw-s.github.io-helm-charts-app-template-immich-machine-learning)
9 | - [**immich-microservices**](./bjw-s.github.io-helm-charts-app-template-immich-microservices) **(this one)**
10 |
11 | For redis and postgres, there are multiple helm charts:
12 | - Redis: [app-template/redis](./bjw-s.github.io-helm-charts-app-template-immich-redis), [bitnami/redis](./charts.bitnami.com-bitnami-redis)
13 | - PostgreSQL: operator [cloudnative-pg/cloudnative-pg](./cloudnative-pg.github.io-charts-cloudnative-pg-postgres), bitnami [bitnami/postgresql](./charts.bitnami.com-bitnami-postgresql)
--------------------------------------------------------------------------------
/web/src/info/node-feature-discovery.md:
--------------------------------------------------------------------------------
1 | [Node Feature Discovery](https://github.com/kubernetes-sigs/node-feature-discovery) is a Kubernetes add-on that helps automate the discovery and configuration of node features such as CPU, memory, and network interfaces.
2 |
3 | Most people in k8s at home use Node Feature Discovery to ensure that pods that need video transcoding capabilities are running on a node with an Intel GPU (which has excellent video transcoding capabilities). But also for detecting a Zigbee/Z-Wave USB sticks.
4 |
5 | For example, the following code would guarantee that a node will run on a Node with Intel GPU:
6 | ```yaml
7 | affinity:
8 | nodeAffinity:
9 | requiredDuringSchedulingIgnoredDuringExecution:
10 | nodeSelectorTerms:
11 | - matchExpressions:
12 | - key: feature.node.kubernetes.io/custom-intel-gpu
13 | operator: In
14 | values:
15 | - "true"
16 | ```
17 |
18 | Node Feature Discovery, would figure out a node has an Intel GPU and add the `feature.node.kubernetes.io/custom-intel-gpu: true` label.
--------------------------------------------------------------------------------
/web/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "allowJs": true,
4 | "alwaysStrict": true,
5 | "allowSyntheticDefaultImports": true,
6 | "baseUrl": ".",
7 | "checkJs": true,
8 | "declaration": true,
9 | "declarationMap": true,
10 | "esModuleInterop": true,
11 | "forceConsistentCasingInFileNames": true,
12 | "incremental": true,
13 | "jsx": "react-jsxdev",
14 | "lib": ["DOM", "DOM.Iterable", "ESNext"],
15 | "strict": true,
16 | "outDir": "dist",
17 | "module": "ESNext",
18 | "moduleResolution": "Node",
19 | "skipLibCheck": true,
20 | "sourceMap": true,
21 | "target": "ES2017",
22 | "paths": {
23 | "@/*": ["src/*"]
24 | }
25 | },
26 | "include": ["src/**/*", "types/*", "server.ts", "node_modules/vite/types/*"],
27 | "exclude": ["dist/**/*"],
28 | "ts-node": {
29 | "transpileOnly": true,
30 | "files": true,
31 | "esm": true,
32 | "moduleTypes": {
33 | "prerender.ts": "cjs"
34 | },
35 | "compilerOptions": {
36 | "module": "CommonJS",
37 | "target": "ESNext",
38 | "moduleResolution": "NodeNext"
39 | }
40 | }
41 | }
--------------------------------------------------------------------------------
/web/src/components/table/index.tsx:
--------------------------------------------------------------------------------
1 | export default function (props: {
2 | headers: any[],
3 | rows: {
4 | key: string,
5 | data: any[]
6 | }[]
7 | }) {
8 | return
16 | // check if table has plex, parse count value and check if it is above 15
17 | // first select row with plex
18 | const rows = await page.locator('table tbody tr:has(a:has-text("plex"))').all();
19 | // at least one row should be found
20 | await expect(rows.length).toBeGreaterThan(0);
21 | // get the count value
22 | const count = await rows[0].locator('td:nth-of-type(3)').innerText();
23 | // check if count is above or equal to 5
24 | await expect(parseInt(count)).toBeGreaterThan(4);
25 |
26 | // click on first cell of first row
27 | await rows[0].locator('td:nth-of-type(1) a').click();
28 |
29 | // check url, it must be either of the two (OCI vs non-OCI)
30 | try {
31 | await expect(page).toHaveURL('/hr/bjw-s-labs.github.io-helm-charts-app-template-plex');
32 | } catch (e) {
33 | await expect(page).toHaveURL('/hr/ghcr.io-bjw-s-labs-helm-app-template-plex');
34 | }
35 | });
36 |
--------------------------------------------------------------------------------
/web/e2e/dynamic.spec.ts:
--------------------------------------------------------------------------------
1 | import { test, expect } from '@playwright/test';
2 |
3 | test('test dynamic page', async ({ page }) => {
4 | await page.goto('.');
5 |
6 |
7 | // Click [placeholder="search a chart"]
8 | await expect(page.locator('[placeholder="Search for a helm release..."]')).toBeFocused();
9 | // Fill [placeholder="search a chart"]
10 | await page.locator('[placeholder="Search for a helm release..."]').type('istio');
11 | // await expect(page).toHaveURL('#/istio');
12 |
13 |
14 | // code to check if the search results are correct
15 | //