From 21dbee4b53e7a632fda5ab48ed79251a084c2efb Mon Sep 17 00:00:00 2001 From: mo Date: Sun, 17 May 2026 13:15:24 +0200 Subject: [PATCH] Add full NAS service catalog for disaster recovery. Compose files and configs for postgres, adguard, duckdns, homarr, neo4j, portainer, remotely, and monitoring; RESTORE.md and sync-from-nas script. Sanitize pgAdmin secrets; document homelab-command as separate repo. Co-authored-by: Cursor --- .env.example | 18 + .gitignore | 3 + README.md | 72 +- RESTORE.md | 72 + configs/adguard/AdGuardHome.yaml | 344 + configs/homarr/Fatima.json | 61 + configs/homarr/Hodeifa.json | 61 + configs/homarr/default.json | 5517 +++++++++++++++++ configs/homarr/isra.json | 61 + docker/adguard/docker-compose.yml | 21 + docker/duckdns/.env.example | 7 + docker/duckdns/docker-compose.yml | 16 + docker/ha-voice-control/docker-compose.yml | 4 +- docker/homarr/docker-compose.yml | 17 + docker/homelab-command/README.md | 15 + docker/monitoring/README.md | 16 + docker/monitoring/docker-compose.grafana.yml | 77 + docker/monitoring/docker-compose.mesh.yml | 31 + docker/monitoring/prometheus.yml | 44 + .../monitoring/prometheus/targets/extra.yml | 9 + .../prometheus/targets/extra.yml.example | 7 + docker/monitoring/prometheus/targets/snmp.yml | 2 + .../prometheus/targets/snmp.yml.example | 5 + docker/neo4j/docker-compose.yml | 16 + docker/portainer/docker-compose.yml | 13 + docker/postgres-web/docker-compose.yml | 2 +- docker/postgres-web/servers.json | 2 +- docker/postgres-web/servers.json.example | 15 + docker/postgres/.env.example | 5 + docker/postgres/docker-compose.yml | 17 + docker/remotely/docker-compose.yml | 11 + scripts/sync-from-nas.sh | 38 + 32 files changed, 6567 insertions(+), 32 deletions(-) create mode 100644 .env.example create mode 100644 RESTORE.md create mode 100644 configs/adguard/AdGuardHome.yaml create mode 100644 configs/homarr/Fatima.json create mode 100644 configs/homarr/Hodeifa.json create mode 100644 configs/homarr/default.json create mode 100644 configs/homarr/isra.json create mode 100644 docker/adguard/docker-compose.yml create mode 100644 docker/duckdns/.env.example create mode 100644 docker/duckdns/docker-compose.yml create mode 100644 docker/homarr/docker-compose.yml create mode 100644 docker/homelab-command/README.md create mode 100644 docker/monitoring/README.md create mode 100644 docker/monitoring/docker-compose.grafana.yml create mode 100644 docker/monitoring/docker-compose.mesh.yml create mode 100644 docker/monitoring/prometheus.yml create mode 100644 docker/monitoring/prometheus/targets/extra.yml create mode 100644 docker/monitoring/prometheus/targets/extra.yml.example create mode 100644 docker/monitoring/prometheus/targets/snmp.yml create mode 100644 docker/monitoring/prometheus/targets/snmp.yml.example create mode 100644 docker/neo4j/docker-compose.yml create mode 100644 docker/portainer/docker-compose.yml create mode 100644 docker/postgres-web/servers.json.example create mode 100644 docker/postgres/.env.example create mode 100644 docker/postgres/docker-compose.yml create mode 100644 docker/remotely/docker-compose.yml create mode 100644 scripts/sync-from-nas.sh diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..48bf6dc --- /dev/null +++ b/.env.example @@ -0,0 +1,18 @@ +# Globale referentie — per service staat een eigen .env.example in docker// + +NAS_IP=192.168.1.211 +POSTGRES_USER=mo +POSTGRES_PASSWORD=changeme +POSTGRES_DB=homelab +PG_HOST_PORT=5433 + +GRAFANA_ADMIN_USER=admin +GRAFANA_ADMIN_PASSWORD=changeme_grafana +GRAFANA_ROOT_URL=http://192.168.1.211:3002 + +PGADMIN_PASSWORD=changeme +PGADMIN_EMAIL=mo@el-kadi.nl + +NEO4J_AUTH=neo4j/changeme +DUCKDNS_SUBDOMAINS=mohome020 +DUCKDNS_TOKEN=your-token diff --git a/.gitignore b/.gitignore index d1e2438..d2ee129 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,9 @@ .DS_Store Thumbs.db *.bak +.env +.env.* +!.env.example # Runtime data (niet in git) *.db diff --git a/README.md b/README.md index 9d6c5b5..22fb182 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,53 @@ # Homelab Infrastructure Configuration -Docker compose, application configs, nginx, deploy scripts, en Proxmox configs voor Synology NAS (192.168.1.211). +Docker compose, applicatie-configs, nginx en deploy-scripts voor Synology NAS (`192.168.1.211`). -## Repos -| Service | Repo | -|---|---| -| HA Voice Control MCP | [ha-voice-control-mcp](http://192.168.1.211:3000/mo/ha-voice-control-mcp) | -| Homelab Configs | [homelab-configs](http://192.168.1.211:3000/mo/homelab-configs) (dit repo) | +**Snel herstellen:** zie [RESTORE.md](RESTORE.md) + +## Repos op Gitea + +| Repo | Inhoud | +|------|--------| +| [homelab-configs](http://192.168.1.211:3000/mo/homelab-configs) | Dit repo — infra, compose, configs | +| [homelab-command](http://192.168.1.211:3000/mo/homelab-command) | Dashboard-app + Grafana-build + mesh | +| [ha-voice-control-mcp](http://192.168.1.211:3000/mo/ha-voice-control-mcp) | Home Assistant voice MCP | ## Structuur ``` docker/ - gitea/ # Gitea self-hosted Git (poort 3000) - ha-voice-control/ # HA Voice Control MCP server (poort 8765) - guacamole/ # Guacamole remote desktop (poort 8348) - excalidraw/ # Excalidraw whiteboard (poort 3765) - wazuh/ # Wazuh SIEM security monitoring -nginx/ # Reverse proxy configs (ha.el-kadi.nl) -configs/ # Application configs - home-assistant/ # Home Assistant (192.168.1.235:8123) - prowlarr/ # Torrent indexer management - sonarr/ # TV series management - radarr/ # Movie management - qbittorrent/ # Torrent client - sabnzbd/ # Usenet client - unifi/ # UniFi Controller (192.168.1.24) - proxmox/ # Proxmox VE configs - pve/ # Node "pve" (192.168.1.216, PVE 9.1.6, RTX 3090) - qemu-server/ # 2 VMs: W11, Syno-latest - lxc/ # 18 LXCs (100-119) - proxmox/ # Node "proxmox" (192.168.1.56, PVE 8.4.14, Dell) - qemu-server/ # 5 VMs - lxc/ # 12 LXCs -scripts/ # Deploy en setup scripts + postgres/ # PostgreSQL homelab (5433) + postgres-web/ # pgAdmin (5434) + gitea/ # Git server (3000) + adguard/ # DNS/filter (host network) + duckdns/ # Dynamische DNS + homarr/ # Dashboard (4755) + neo4j/ # Graph DB + portainer/ # Docker UI (9000) + remotely/ # Remote support (8080) + excalidraw/ # Whiteboard (3765) + guacamole/ # Remote desktop (8348) + wazuh/ # SIEM + ha-voice-control/ # HA MCP (8765) + monitoring/ # Prometheus + refs naar homelab-command + homelab-command/ # README → aparte repo +configs/ + adguard/ # AdGuardHome.yaml + homarr/ # Dashboard JSON + home-assistant/ + prowlarr/ sonarr/ radarr/ qbittorrent/ sabnzbd/ + proxmox/ +nginx/ +scripts/ + sync-from-nas.sh # NAS → git vóór commit ``` + +## Workflow + +1. Wijziging op NAS → `sh scripts/sync-from-nas.sh` +2. `git add -A && git commit && git push` +3. Bij disaster → [RESTORE.md](RESTORE.md) + +## Poorten + +Zie RESTORE.md tabel. diff --git a/RESTORE.md b/RESTORE.md new file mode 100644 index 0000000..fe2dca5 --- /dev/null +++ b/RESTORE.md @@ -0,0 +1,72 @@ +# Snel herstellen na NAS-reset of nieuwe host + +**NAS:** `192.168.1.211` · **Gitea:** http://192.168.1.211:3000 + +## 1. Clone repos + +```bash +mkdir -p /volume1/docker /volume1/homes/mo +git clone http://192.168.1.211:3000/mo/homelab-configs.git /volume1/docker/homelab-configs +git clone http://192.168.1.211:3000/mo/homelab-command.git /volume1/homes/mo/homelab-command +``` + +## 2. Secrets + +Kopieer per service `.env.example` → `.env` en vul wachtwoorden in. +**Nooit** echte `.env` committen. + +## 3. Startvolgorde (Docker) + +| Stap | Service | Commando | +|------|---------|----------| +| 1 | Netwerk monitoring | `docker network create homelab-monitor` | +| 2 | PostgreSQL | `cd /volume1/docker/homelab-configs/docker/postgres && docker compose up -d` | +| 3 | Gitea | `cd .../docker/gitea && docker compose up -d` | +| 4 | AdGuard | Zet `configs/adguard/AdGuardHome.yaml` op NAS, dan `docker/adguard` | +| 5 | DuckDNS | `docker/duckdns` met `.env` | +| 6 | Neo4j | `docker/neo4j` | +| 7 | pgAdmin | `docker/postgres-web` | +| 8 | Monitoring | Zie `docker/monitoring/README.md` + homelab-command build | +| 9 | Homelab Command | `homelab-command`: `docker compose -f docker-compose.homelab.yml up -d --build` | +| 10 | Mesh (NATS) | `homelab-command`: `docker compose -f docker-compose.mesh.yml up -d` | +| 11 | Homarr, Portainer, Remotely, Excalidraw | elk in `docker//` | +| 12 | Overige | Guacamole, Wazuh, HA-voice — zie `docker/` submappen | + +Na stap 8: verbind containers op `homelab-monitor`: + +```bash +for c in postgres-homelab neo4j prometheus-homelab postgres-exporter-homelab grafana-homelab; do + docker network connect homelab-monitor "$c" 2>/dev/null || true +done +``` + +## 4. Config terugzetten + +| Wat | Bron in git | NAS-pad | +|-----|-------------|---------| +| Homarr | `configs/homarr/*.json` | `/volume1/docker/homarr/` | +| AdGuard | `configs/adguard/AdGuardHome.yaml` | `/volume1/docker/Configs/adguard/` | +| pgAdmin servers | `docker/postgres-web/servers.json` | naast compose | +| *arr / HA / Proxmox | `configs/` | zie README.md structuur | + +## 5. Sync vóór commit + +```bash +sh /volume1/docker/homelab-configs/scripts/sync-from-nas.sh +cd /volume1/docker/homelab-configs && git add -A && git status +``` + +## Poorten (referentie) + +| Poort | Service | +|-------|---------| +| 3000 | Gitea | +| 3002 | Grafana | +| 4222 | NATS | +| 4755 | Homarr | +| 5433 | PostgreSQL | +| 5434 | pgAdmin | +| 8080 | Remotely | +| 8765 | Homelab Command | +| 9090 | Prometheus | +| 9000 | Portainer | diff --git a/configs/adguard/AdGuardHome.yaml b/configs/adguard/AdGuardHome.yaml new file mode 100644 index 0000000..4fb1ac8 --- /dev/null +++ b/configs/adguard/AdGuardHome.yaml @@ -0,0 +1,344 @@ +http: + pprof: + port: 6060 + enabled: false + address: 192.168.1.211:3001 + session_ttl: 720h +users: + - name: mo + password: $2a$10$hTko3Z04gyjeG1PwE1AIDObRmamgNOGzH9b66G/FRK75HIhVjhILO +auth_attempts: 5 +block_auth_min: 15 +http_proxy: "" +language: "" +theme: auto +dns: + bind_hosts: + - 0.0.0.0 + port: 53 + anonymize_client_ip: false + ratelimit: 20 + ratelimit_subnet_len_ipv4: 24 + ratelimit_subnet_len_ipv6: 56 + ratelimit_whitelist: [] + refuse_any: true + upstream_dns: + - https://dns10.quad9.net/dns-query + upstream_dns_file: "" + bootstrap_dns: + - 9.9.9.10 + - 149.112.112.10 + - 2620:fe::10 + - 2620:fe::fe:10 + fallback_dns: [] + upstream_mode: load_balance + fastest_timeout: 1s + allowed_clients: [] + disallowed_clients: [] + blocked_hosts: + - version.bind + - id.server + - hostname.bind + trusted_proxies: + - 127.0.0.0/8 + - ::1/128 + cache_enabled: true + cache_size: 4194304 + cache_ttl_min: 0 + cache_ttl_max: 0 + cache_optimistic: false + cache_optimistic_answer_ttl: 30s + cache_optimistic_max_age: 12h + bogus_nxdomain: [] + aaaa_disabled: false + enable_dnssec: false + edns_client_subnet: + custom_ip: "" + enabled: false + use_custom: false + max_goroutines: 300 + handle_ddr: true + ipset: [] + ipset_file: "" + bootstrap_prefer_ipv6: false + upstream_timeout: 10s + private_networks: [] + use_private_ptr_resolvers: true + local_ptr_upstreams: [] + use_dns64: false + dns64_prefixes: [] + serve_http3: false + use_http3_upstreams: false + serve_plain_dns: true + hostsfile_enabled: true + pending_requests: + enabled: true +tls: + enabled: false + server_name: "" + force_https: false + port_https: 443 + port_dns_over_tls: 853 + port_dns_over_quic: 853 + port_dnscrypt: 0 + dnscrypt_config_file: "" + allow_unencrypted_doh: false + certificate_chain: "" + private_key: "" + certificate_path: "" + private_key_path: "" + strict_sni_check: false +querylog: + dir_path: "" + ignored: [] + interval: 2160h + size_memory: 1000 + enabled: true + ignored_enabled: false + file_enabled: true +statistics: + dir_path: "" + ignored: [] + interval: 24h + enabled: true + ignored_enabled: false +filters: + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_1.txt + name: AdGuard DNS filter + id: 1 + - enabled: false + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_2.txt + name: AdAway Default Blocklist + id: 2 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_34.txt + name: HaGeZi's Normal Blocklist + id: 1771582373 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_48.txt + name: HaGeZi's Pro Blocklist + id: 1771582374 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_51.txt + name: HaGeZi's Pro++ Blocklist + id: 1771582375 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_29.txt + name: 'CHN: AdRules DNS List' + id: 1771582376 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_21.txt + name: 'CHN: anti-AD' + id: 1771582377 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_35.txt + name: 'HUN: Hufilter' + id: 1771582378 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_22.txt + name: 'IDN: ABPindo' + id: 1771582379 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_19.txt + name: 'IRN: PersianBlocker list' + id: 1771582380 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_43.txt + name: 'ISR: EasyList Hebrew' + id: 1771582381 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_25.txt + name: 'KOR: List-KR DNS' + id: 1771582382 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_15.txt + name: 'KOR: YousList' + id: 1771582383 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_36.txt + name: 'LIT: EasyList Lithuania' + id: 1771582384 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_20.txt + name: 'MKD: Macedonian Pi-hole Blocklist' + id: 1771582385 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_13.txt + name: 'NOR: Dandelion Sprouts nordiske filtre' + id: 1771582386 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_41.txt + name: 'POL: CERT Polska List of malicious domains' + id: 1771582387 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_14.txt + name: 'POL: Polish filters for Pi-hole' + id: 1771582388 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_17.txt + name: 'SWE: Frellwit''s Swedish Hosts File' + id: 1771582389 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_26.txt + name: 'TUR: turk-adlist' + id: 1771582390 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_40.txt + name: 'TUR: Turkish Ad Hosts' + id: 1771582391 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_16.txt + name: 'VNM: ABPVN List' + id: 1771582392 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_30.txt + name: Phishing URL Blocklist (PhishTank and OpenPhish) + id: 1771582393 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_18.txt + name: Phishing Army + id: 1771582394 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_9.txt + name: The Big List of Hacked Malware Web Sites + id: 1771582395 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_50.txt + name: uBlock₀ filters – Badware risks + id: 1771582396 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_11.txt + name: Malicious URL Blocklist (URLHaus) + id: 1771582397 + - enabled: true + url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_47.txt + name: HaGeZi's Gambling Blocklist + id: 1771582398 +whitelist_filters: [] +user_rules: + - '@@||g.live.com^$important' + - '@@||ashemaletube.com^$client=''192.168.1.235''' + - '@@||o540343.ingest.sentry.io^$important' + - '@@||console.bce.baidu.com^$important' + - "" +dhcp: + enabled: false + interface_name: "" + local_domain_name: lan + dhcpv4: + gateway_ip: "" + subnet_mask: "" + range_start: "" + range_end: "" + lease_duration: 86400 + icmp_timeout_msec: 1000 + options: [] + dhcpv6: + range_start: "" + lease_duration: 86400 + ra_slaac_only: false + ra_allow_slaac: false +filtering: + blocking_ipv4: "" + blocking_ipv6: "" + blocked_services: + schedule: + time_zone: UTC + ids: + - 4chan + - 500px + - 9gag + - activision_blizzard + - amino + - battle_net + - betano + - betfair + - betway + - blaze + - blizzard_entertainment + - bluesky + - douban + - electronic_arts + - epic_games + - facebook + - gog + - instagram + - io_interactive + - kook + - leagueoflegends + - line + - mail_ru + - minecraft + - nintendo + - odysee + - ok + - onlyfans + - origin + - playstation + - plenty_of_fish + - qq + - riot_games + - rockstar_games + - snapchat + - steam + - tiktok + - tinder + - tumblr + - ubisoft + - valorant + - vk + - wargaming + - warnerbrosgames + - wizz + - xboxlive + - zhihu + protection_disabled_until: null + safe_search: + enabled: true + bing: true + duckduckgo: true + ecosia: true + google: true + pixabay: true + yandex: true + youtube: true + blocking_mode: default + parental_block_host: family-block.dns.adguard.com + safebrowsing_block_host: standard-block.dns.adguard.com + rewrites: [] + safe_fs_patterns: + - /opt/adguardhome/work/userfilters/* + safebrowsing_cache_size: 1048576 + safesearch_cache_size: 1048576 + parental_cache_size: 1048576 + cache_time: 30 + filters_update_interval: 24 + blocked_response_ttl: 10 + filtering_enabled: true + rewrites_enabled: true + parental_enabled: false + safebrowsing_enabled: true + protection_enabled: true +clients: + runtime_sources: + whois: true + arp: true + rdns: true + dhcp: true + hosts: true + persistent: [] +log: + enabled: true + file: "" + max_backups: 0 + max_size: 100 + max_age: 3 + compress: false + local_time: false + verbose: false +os: + group: "" + user: "" + rlimit_nofile: 0 +schema_version: 33 diff --git a/configs/homarr/Fatima.json b/configs/homarr/Fatima.json new file mode 100644 index 0000000..2b7965e --- /dev/null +++ b/configs/homarr/Fatima.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "configProperties": { + "name": "Fatima" + }, + "categories": [ + { + "id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a33f", + "position": 1, + "name": "Welcome to Homarr 🎉" + } + ], + "wrappers": [ + { + "id": "default", + "position": 0 + }, + { + "id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a326", + "position": 1 + } + ], + "apps": [], + "widgets": [], + "settings": { + "common": { + "searchEngine": { + "type": "google", + "properties": {} + } + }, + "customization": { + "layout": { + "enabledLeftSidebar": false, + "enabledRightSidebar": false, + "enabledDocker": false, + "enabledPing": false, + "enabledSearchbar": true + }, + "pageTitle": "Homarr ⭐️", + "logoImageUrl": "/imgs/logo/logo.png", + "faviconUrl": "/imgs/favicon/favicon-squared.png", + "backgroundImageUrl": "", + "customCss": "", + "colors": { + "primary": "red", + "secondary": "yellow", + "shade": 7 + }, + "appOpacity": 100, + "gridstack": { + "columnCountSmall": 3, + "columnCountMedium": 6, + "columnCountLarge": 10 + } + }, + "access": { + "allowGuests": false + } + } +} \ No newline at end of file diff --git a/configs/homarr/Hodeifa.json b/configs/homarr/Hodeifa.json new file mode 100644 index 0000000..a58f9c3 --- /dev/null +++ b/configs/homarr/Hodeifa.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "configProperties": { + "name": "Hodeifa" + }, + "categories": [ + { + "id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a33f", + "position": 1, + "name": "Welcome to Homarr 🎉" + } + ], + "wrappers": [ + { + "id": "default", + "position": 0 + }, + { + "id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a326", + "position": 1 + } + ], + "apps": [], + "widgets": [], + "settings": { + "common": { + "searchEngine": { + "type": "google", + "properties": {} + } + }, + "customization": { + "layout": { + "enabledLeftSidebar": false, + "enabledRightSidebar": false, + "enabledDocker": false, + "enabledPing": false, + "enabledSearchbar": true + }, + "pageTitle": "Homarr ⭐️", + "logoImageUrl": "/imgs/logo/logo.png", + "faviconUrl": "/imgs/favicon/favicon-squared.png", + "backgroundImageUrl": "", + "customCss": "", + "colors": { + "primary": "red", + "secondary": "yellow", + "shade": 7 + }, + "appOpacity": 100, + "gridstack": { + "columnCountSmall": 3, + "columnCountMedium": 6, + "columnCountLarge": 10 + } + }, + "access": { + "allowGuests": false + } + } +} \ No newline at end of file diff --git a/configs/homarr/default.json b/configs/homarr/default.json new file mode 100644 index 0000000..904779c --- /dev/null +++ b/configs/homarr/default.json @@ -0,0 +1,5517 @@ +{ + "schemaVersion": 2, + "configProperties": { + "name": "default" + }, + "categories": [ + { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee", + "name": "HomeLab Stuff", + "position": 1 + }, + { + "id": "7da95f8a-2915-4bca-80b5-973c2129eafc", + "name": "Other", + "position": 3, + "type": "category" + }, + { + "id": "81cc4f36-2a5c-4813-9421-aaf163e76efd", + "name": "AI", + "position": 2, + "type": "category" + }, + { + "id": "9687cffd-a1e0-446c-a3fc-8674e0f70d42", + "name": "Data Stuff", + "position": 4 + }, + { + "id": "77030622-1a31-43fe-9d0e-94442669a3dc", + "name": "HTML5", + "position": 5 + }, + { + "id": "2ab74a15-f14c-46de-92b3-816337ef8b59", + "name": "Projects", + "position": 6 + } + ], + "wrappers": [ + { + "id": "default", + "position": 0 + }, + { + "id": "2e1ef0c8-086a-4853-b5f0-973d207bb775", + "position": 2 + }, + { + "id": "a0d91c5a-5c0b-460f-a899-7abaa846f0ad", + "position": 3 + }, + { + "id": "353b19e1-0047-4f2b-b8f7-1531b9b44440", + "position": 4 + }, + { + "id": "e62c845c-bbec-43c2-971c-8aaf62befffb", + "position": 5 + }, + { + "id": "77cbda25-e6c7-45f6-afd0-422e4ee6cc57", + "position": 6 + } + ], + "apps": [ + { + "id": "898e1be0-1ac2-4405-950d-17fda7469422", + "name": "Resume Builder", + "url": "http://192.168.1.150:9751", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/loganmarchione/homelab-svg-assets/assets/riscv.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.150:9751/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 2, + "y": 5 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 9, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 17 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "b2636c99-49ae-4034-9c0b-d8372b10eeb5", + "name": "openresume", + "url": "http://192.168.1.150:6155", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/open-resume.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.150:6155/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 3, + "y": 5 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 0, + "y": 6 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 21 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "76feb375-9a63-4335-86ae-4db5022f005a", + "name": "Change detection", + "url": "http://192.168.1.117:5000", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/changedetection.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.117:5000/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 3, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 10, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 22 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "7c161902-7150-4ff7-9b75-bbe2d64449e7", + "name": "Proxmox (3090)", + "url": "https://192.168.1.216:8006", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/proxmox-light.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://192.168.1.216:8006/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 3, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 11, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 23 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "4a4bed3b-9fec-4643-b86e-dd47cf8de09d", + "name": "nodecast", + "url": "http://192.168.1.107:3000/#home", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/nodecast-tv.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.107:3000/#home" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 4, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 12, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 24 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "4b77eb77-a28c-4661-8f11-8e3dd3b0f60f", + "name": "Traccar", + "url": "http://192.168.1.150:8082", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/traccar-dark.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.150:8082" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 3, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 13, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 25 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "7b4c2068-7024-4f34-8147-9621ad7741b0", + "name": "Proxmox (Dell)", + "url": "https://192.168.1.56:8006", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/proxmox-light.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://192.168.1.56:8006" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 2, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 3, + "y": 8 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 26 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "a82d9484-93d0-46e3-95bf-6b5975a4dbd8", + "name": "nextcloud", + "url": "https://cloud.el-kadi.nl/index.php/apps/dashboard", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/nextcloud-blue.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://cloud.el-kadi.nl/index.php/apps/dashboard/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 0, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 14, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 31 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "71605aa5-6e5d-4659-b339-0601b6c78583", + "name": "Minarca", + "url": "http://192.168.1.203:8080/login", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/urbackup.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.203:8080/login/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 7, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 18 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 8, + "y": 6 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "64100583-20a8-4742-9d19-5b3415966e1b", + "name": "Invoice Generator", + "url": "http://192.168.1.150:3099", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/invoice-ninja-light.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.150:3099/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 2, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 15, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 27 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "d929ace4-0861-4fb6-8295-226032ed1e9b", + "name": "Vert", + "url": "http://192.168.1.150:3884", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/vertiv-dark.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.150:3884/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 6, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 0, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 28 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "8a036e23-8dd9-4030-83ff-17ec0b726905", + "name": "Vaultwarden", + "url": "https://192.168.1.6:8000/#/vault", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/vaultwarden-light.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://192.168.1.6:8000/#/vault" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 3, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 1, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 29 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "cd294fec-1dec-4e2b-b540-c6ce47cef754", + "name": "Moocup", + "url": "http://192.168.1.150:3591", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/cup.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.150:3591/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 5, + "y": 5 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 2, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 30 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "9d5ba677-e153-4c88-bd95-fe264ca15144", + "name": "Mytkstar", + "url": "https://www.mytkstar.net/Monitor.aspx", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/PapirusDevelopmentTeam/papirus_icons/src/apps_gps_data.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://www.mytkstar.net/Monitor.aspx" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 1, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 3, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 32 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "92441b55-bb8e-418e-b398-a174efc62561", + "name": "n8n", + "url": "http://192.168.1.64:5678/home/workflows", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/n8n.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.64:5678/home/workflows" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 1, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 3, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 33 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "36552573-b1ad-4e5c-a892-63d3537947bf", + "name": "Proxmox", + "url": "http://192.168.1.230:8006", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/proxmox.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.230:8006" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 1, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 4, + "y": 0 + }, + "size": { + "width": 2, + "height": 2 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "8ef1f733-3cbc-4fd2-bf4a-d57325aa9b79", + "name": "Portainer (proxmox)", + "url": "https://192.168.5.128:9443/#!/home", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/portainer.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://192.168.5.128:9443/#!/home" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 1, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 4, + "y": 5 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 34 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "c2cb798f-ca1b-4157-b246-5d3bd33e24f4", + "name": "Rackula", + "url": "https://count.racku.la", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/brick-tracker.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://count.racku.la/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 1, + "y": 5 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 5, + "y": 5 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 35 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "2704df1c-eec6-4048-857c-a00905d3ae07", + "name": "TrueNAS", + "url": "http://192.168.1.185", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/truenas.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.185/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 3, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 1, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 8, + "y": 0 + }, + "size": { + "width": 2, + "height": 2 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "5c0cab6c-87bc-4724-8aba-e47be2afc602", + "name": "Adguard", + "url": "http://192.168.1.211:3001", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/loganmarchione/homelab-svg-assets/assets/adguardhome.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.211:3001" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 4, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 4, + "y": 2 + }, + "size": { + "width": 2, + "height": 2 + } + } + }, + "integration": { + "type": "adGuardHome", + "properties": [ + { + "field": "username", + "type": "public", + "value": "mo" + }, + { + "field": "password", + "type": "private", + "value": "WaQTUw2t" + } + ] + } + }, + { + "id": "df1703b6-b059-4ab8-8389-1a121cf6c4ee", + "name": "Firefox", + "url": "https://192.168.1.150:5813", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/firefox-beta.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://192.168.1.150:5813/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 7, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 6, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 36 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "6b045d0d-857a-4178-98df-561784f64fe7", + "name": "Browserless", + "url": "http://192.168.1.150:3000", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/browserless-light.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.150:3000/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 7, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 1, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 37 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "a1154498-22fe-4e6b-bf7f-816c8e4833d0", + "name": "Mawaqit", + "url": "https://mawaqit.net/nl/el-kadi-amsterdam-1061dj-netherlands", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/activepieces.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://mawaqit.net/nl/el-kadi-amsterdam-1061dj-netherlands" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 4, + "y": 5 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 10, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 38 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "6c0b58ff-e1f4-49ac-8f65-8c2c70c4c149", + "name": "Frigate", + "url": "https://192.168.1.185:30058", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/frigate-light.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://192.168.1.185:30058/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 6, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 0, + "y": 2 + }, + "size": { + "width": 2, + "height": 2 + } + }, + "sm": { + "location": { + "x": 0, + "y": 19 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "e7887282-98b1-477f-8aef-f454ad0e6b29", + "name": "Tunarr", + "url": "http://192.168.1.237:8000", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/tunarr.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.237:8000" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 5, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 7, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 39 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "4285cf27-d105-4f81-8527-24d8339f67ca", + "name": "HA", + "url": "http://192.168.1.235:8123", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/home-assistant-alt.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.235:8123" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 0, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 1, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 10, + "y": 2 + }, + "size": { + "width": 2, + "height": 2 + } + } + }, + "integration": { + "type": "homeAssistant", + "properties": [ + { + "field": "apiKey", + "type": "private", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiIxNGU4ZGVjM2U3MzI0NmFjOTlkYjA2NmJjNjI3ODRlMSIsImlhdCI6MTczMjAxNDM3MiwiZXhwIjoyMDQ3Mzc0MzcyfQ.bBG9xRm0zEuy553CUyfZZueoPHEx8xgl7-oGv4oFqdQ" + } + ] + } + }, + { + "id": "651feda8-1f43-45a4-bb1f-312cb02c2f0b", + "name": "Unifi", + "url": "https://192.168.1.24", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/unifi.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://192.168.1.24" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 0, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 1, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 12, + "y": 4 + }, + "size": { + "width": 2, + "height": 2 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "aebebd38-0cd6-4ad8-ac00-9d49c7ba312e", + "name": "Wazuh", + "url": "https://192.168.1.73", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/wazuh.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://192.168.1.73/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "md": { + "location": { + "x": 8, + "y": 2 + }, + "size": { + "width": 2, + "height": 2 + } + }, + "lg": { + "location": { + "x": 6, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 20 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "e3cb492d-f6d0-4139-bada-38368acdb725", + "name": "Modem", + "url": "https://192.168.10.1", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/zyxel-communications.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://192.168.10.1/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 4, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 0, + "y": 4 + }, + "size": { + "width": 2, + "height": 2 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "2425c0d8-6633-4895-8f89-d411f3b39b7b", + "name": "Background Remover", + "url": "http://192.168.1.150:8519", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/PapirusDevelopmentTeam/papirus_icons/src/apps_background_eraser.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.150:8519/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 6, + "y": 5 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 8, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 40 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "e18a58f0-5bdd-4bc9-846d-f96653ab02a1", + "name": "Linkwarden", + "url": "http://192.168.1.150:7461/dashboard", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/linkwarden.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.150:7461/dashboard" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 4, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 0, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 41 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "85f3c650-21a8-467f-81e0-111d34571caa", + "name": "Thunderbird", + "url": "http://192.168.1.150:5800", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/thunderbird.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.150:5800/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 4, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 2, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 42 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "43711e4d-3df4-480e-9c71-74b1251f3f4c", + "name": "Excalidraw", + "url": "http://192.168.1.211:3765", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/excalidraw.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.211:3765/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 0, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 9, + "y": 6 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 43 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "11199d11-b28a-4c00-991f-b22c6b2cd3d1", + "name": "Nginx", + "url": "http://192.168.1.173:81", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/nginx-proxy-manager.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.173:81/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 1, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 3, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 44 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "7f4e5465-5aba-459d-925c-2a4da234051b", + "name": "Webmin", + "url": "https://192.168.5.24:10000", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/webmin.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://192.168.5.24:10000" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 2, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 1, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 45 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "9fa10413-3429-4b77-a98b-67ac4e53547a", + "name": "PVE Scripts", + "url": "http://192.168.1.25:3000", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/webdb.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.25:3000/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 7, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 2, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 46 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "ea1f4f71-4903-4632-b28c-8ec18bb6804b", + "name": "iDrac", + "url": "http://192.168.1.227", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/idrac.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.227" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 5, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 2, + "y": 2 + }, + "size": { + "width": 2, + "height": 2 + } + }, + "sm": { + "location": { + "x": 1, + "y": 5 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "06fdf904-56b2-428f-957a-0fd8a6b47163", + "name": "Immich", + "url": "http://192.168.1.17:2283", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/immich-frame-light.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.17:2283" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 7, + "y": 5 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 47 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 6, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "dd32fa7d-8456-4829-a29d-219b0ea7ea37", + "name": "Remotely", + "url": "http://192.168.1.211:8080", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/remotely.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.211:8080/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 2, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 10, + "y": 0 + }, + "size": { + "width": 2, + "height": 2 + } + }, + "sm": { + "location": { + "x": 1, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "5ff36503-6094-4149-bbec-ecf0e2b2f6a5", + "name": "Phind", + "url": "https://www.phind.com/search?home=true", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/google-chat.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://www.phind.com/search?home=true" + }, + "area": { + "type": "category", + "properties": { + "id": "81cc4f36-2a5c-4813-9421-aaf163e76efd" + } + }, + "shape": { + "lg": { + "location": { + "x": 1, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 2, + "y": 0 + }, + "size": { + "width": 2, + "height": 2 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "4fd15bfa-95c2-459d-8170-929f082507ae", + "name": "mo-nas", + "url": "http://192.168.1.150:5000", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/synology-dsm.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.150:5000" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 7, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 12 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 6, + "y": 0 + }, + "size": { + "width": 2, + "height": 2 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "e9273528-92d5-437b-b494-5b79a8b9e44a", + "name": "Deepseek", + "url": "https://chat.deepseek.com", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/PapirusDevelopmentTeam/papirus_icons/src/apps_dolphin_zero_browser.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://chat.deepseek.com/" + }, + "area": { + "type": "category", + "properties": { + "id": "81cc4f36-2a5c-4813-9421-aaf163e76efd" + } + }, + "shape": { + "lg": { + "location": { + "x": 4, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 6 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 4, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "4e6c0c90-062e-449e-b650-47327f3a05ea", + "name": "DSM on Proxmox", + "url": "https://blog.nootch.net", + "appearance": { + "iconUrl": "/imgs/logo/logo.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://blog.nootch.net/" + }, + "area": { + "type": "category", + "properties": { + "id": "7da95f8a-2915-4bca-80b5-973c2129eafc" + } + }, + "shape": { + "lg": { + "location": { + "x": 1, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 12, + "y": 0 + }, + "size": { + "width": 2, + "height": 2 + } + }, + "sm": { + "location": { + "x": 0, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "6cb9cb11-74b1-45d9-b7f7-9d5f1f96ab15", + "name": "NAS", + "url": "http://192.168.1.211:5000", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/synology-dsm.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.211:5000" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 6, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 9 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 14, + "y": 0 + }, + "size": { + "width": 2, + "height": 2 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "361ddd3e-12db-42ec-8a42-116a3baaa542", + "name": "Anthropic", + "url": "https://console.anthropic.com/dashboard", + "appearance": { + "iconUrl": "/imgs/logo/logo.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://console.anthropic.com/dashboard" + }, + "area": { + "type": "category", + "properties": { + "id": "81cc4f36-2a5c-4813-9421-aaf163e76efd" + } + }, + "shape": { + "lg": { + "location": { + "x": 7, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 0, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 5 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "ea743c75-fa61-4eb7-8acc-28bba9de4d9f", + "name": "DSM Video station 7.2", + "url": "https://github.com/007revad/Video_Station_for_DSM_722?tab=readme-ov-file", + "appearance": { + "iconUrl": "/imgs/logo/logo.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://github.com/007revad/Video_Station_for_DSM_722?tab=readme-ov-file" + }, + "area": { + "type": "category", + "properties": { + "id": "7da95f8a-2915-4bca-80b5-973c2129eafc" + } + }, + "shape": { + "lg": { + "location": { + "x": 3, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 3, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "7bb12859-5ce0-45fa-a62c-7d7474197124", + "name": "Ring", + "url": "https://account.ring.com/account/dashboard?l=24b26010-2cac-48f2-b8ec-e1ef4b5fa79e", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/PapirusDevelopmentTeam/papirus_icons/src/apps_bring.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://account.ring.com/account/dashboard?l=24b26010-2cac-48f2-b8ec-e1ef4b5fa79e" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 5, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 11, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 9 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "1c9235d7-d37a-41dd-90cd-faf1450699e1", + "name": "Github", + "url": "https://github.com/modammer020", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/github.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://github.com/modammer020" + }, + "area": { + "type": "category", + "properties": { + "id": "81cc4f36-2a5c-4813-9421-aaf163e76efd" + } + }, + "shape": { + "lg": { + "location": { + "x": 6, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 14, + "y": 0 + }, + "size": { + "width": 2, + "height": 2 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "8839f201-3c52-4a32-a76f-bee9e85d4274", + "name": "Turnkey", + "url": "https://www.turnkeylinux.org", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/azure-container-instances.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://www.turnkeylinux.org/" + }, + "area": { + "type": "category", + "properties": { + "id": "7da95f8a-2915-4bca-80b5-973c2129eafc" + } + }, + "shape": { + "lg": { + "location": { + "x": 7, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 0, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "3a506899-97a5-4160-9a1d-19f1e2c39d41", + "name": "Lbrty", + "url": "https://lbrty.ai", + "appearance": { + "iconUrl": "/imgs/logo/logo.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://lbrty.ai/" + }, + "area": { + "type": "category", + "properties": { + "id": "81cc4f36-2a5c-4813-9421-aaf163e76efd" + } + }, + "shape": { + "sm": { + "location": { + "x": 0, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "lg": { + "location": { + "x": 2, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 6, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "72ad039f-e4fa-4f20-9d3a-cf4fa8bd4436", + "name": "Portainer", + "url": "http://192.168.1.150:9000", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/portainer.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.150:9000/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 2, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 4, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 10 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "a0901aaa-34ca-4eae-b986-4cc08bde2e65", + "name": "Grok", + "url": "https://grok.com", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/grocy.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://grok.com/" + }, + "area": { + "type": "category", + "properties": { + "id": "81cc4f36-2a5c-4813-9421-aaf163e76efd" + } + }, + "shape": { + "lg": { + "location": { + "x": 3, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 1, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 6 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "ca41aa69-6e38-4a4d-8c7d-e8b9192ef5b7", + "name": "LXC", + "url": "https://community-scripts.github.io/ProxmoxVE", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/loganmarchione/homelab-svg-assets/assets/lxc.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://community-scripts.github.io/ProxmoxVE/" + }, + "area": { + "type": "category", + "properties": { + "id": "7da95f8a-2915-4bca-80b5-973c2129eafc" + } + }, + "shape": { + "lg": { + "location": { + "x": 6, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 1, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 8 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "9cef81f8-bea7-4100-826f-667f5cced226", + "name": "CRM", + "url": "https://www.fixaanhuis.nl/crm", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/dolibarr.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://www.fixaanhuis.nl/crm" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 5, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 12, + "y": 0 + }, + "size": { + "width": 2, + "height": 2 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "00fd7062-ed37-4509-9c45-b5b09dab22a0", + "name": "LMarena", + "url": "https://lmarena.ai", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/azure-container-service.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://lmarena.ai/" + }, + "area": { + "type": "category", + "properties": { + "id": "81cc4f36-2a5c-4813-9421-aaf163e76efd" + } + }, + "shape": { + "lg": { + "location": { + "x": 1, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 1, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 8 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "f1dfc5dd-3fe5-43cb-a521-71cd1006630b", + "name": "DSM auxxxilium", + "url": "https://arc.auxxxilium.tech", + "appearance": { + "iconUrl": "/imgs/logo/logo.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://arc.auxxxilium.tech/" + }, + "area": { + "type": "category", + "properties": { + "id": "7da95f8a-2915-4bca-80b5-973c2129eafc" + } + }, + "shape": { + "lg": { + "location": { + "x": 5, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 2, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "0ac42efc-6831-4762-8412-d2f624e10d40", + "name": "Gitea", + "url": "http://192.168.1.211:3000", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/gitea.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.211:3000" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 0, + "y": 6 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 5, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "1446d0cd-5449-4e41-b68b-15b4052f6325", + "name": "Neo4j Browser", + "url": "http://192.168.1.211:49154", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/neo4j.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.211:49154" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 1, + "y": 6 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 12, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "039d3bf6-bf8a-4944-a8b1-7cc886daebe7", + "name": "HA Voice Ctrl", + "url": "http://192.168.1.211:8765", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/home-assistant.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.211:8765" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 2, + "y": 6 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 13, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "403f4974-caf6-4662-b048-92f8cf36380d", + "name": "Portainer", + "url": "http://192.168.1.211:9000", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/portainer.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.211:9000" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 3, + "y": 6 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 14, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "ec2298e4-49e7-46c4-a03c-66096630c8ff", + "name": "OnlyOffice", + "url": "http://192.168.5.128/example", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/onlyoffice.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.5.128/example/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 6, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 4, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 13 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "1cdee959-e012-4728-a9ab-30f8b0a21f93", + "name": "Google AI studio", + "url": "https://aistudio.google.com/prompts/new_chat", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/google-gemini.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://aistudio.google.com/prompts/new_chat" + }, + "area": { + "type": "category", + "properties": { + "id": "81cc4f36-2a5c-4813-9421-aaf163e76efd" + } + }, + "shape": { + "lg": { + "location": { + "x": 0, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 2, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 9 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "2cfa9e5c-eb19-4d7f-b85b-9a25b5ecd542", + "name": "Synology stuff (Marius Hosting)", + "url": "https://mariushosting.com", + "appearance": { + "iconUrl": "/imgs/logo/logo.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://mariushosting.com/" + }, + "area": { + "type": "category", + "properties": { + "id": "7da95f8a-2915-4bca-80b5-973c2129eafc" + } + }, + "shape": { + "lg": { + "location": { + "x": 0, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 8, + "y": 0 + }, + "size": { + "width": 2, + "height": 2 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "530e2760-9e48-49f1-a031-4ee6b2760ea1", + "name": "HTML5 templates", + "url": "https://jekyllthemes.io/free", + "appearance": { + "iconUrl": "/imgs/logo/logo.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://jekyllthemes.io/free" + }, + "area": { + "type": "category", + "properties": { + "id": "77030622-1a31-43fe-9d0e-94442669a3dc" + } + }, + "shape": { + "lg": { + "location": { + "x": 1, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 1, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "6bd5b840-b1de-4417-9091-6d58c7bcaa47", + "name": "BentoPDF", + "url": "http://192.168.1.150:3183", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/bentopdf.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.150:3183/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 0, + "y": 5 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 5, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 14 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "2b3102a8-9ae8-47b3-9a56-dc46fc899e77", + "name": "GPT4FREE", + "url": "http://192.168.1.150:6439", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/gpt4free.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.150:6439/" + }, + "area": { + "type": "category", + "properties": { + "id": "81cc4f36-2a5c-4813-9421-aaf163e76efd" + } + }, + "shape": { + "lg": { + "location": { + "x": 0, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 3, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "17915d2a-5039-4d63-bcfe-95c56a5e3941", + "name": "NZB Geek", + "url": "https://nzbgeek.info/dashboard.php", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/PapirusDevelopmentTeam/papirus_icons/src/apps_nzb360.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://nzbgeek.info/dashboard.php" + }, + "area": { + "type": "category", + "properties": { + "id": "7da95f8a-2915-4bca-80b5-973c2129eafc" + } + }, + "shape": { + "md": { + "location": { + "x": 6, + "y": 0 + }, + "size": { + "width": 2, + "height": 2 + } + }, + "lg": { + "location": { + "x": 4, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "81e621a6-fab0-4f62-8f0a-14954276c60f", + "name": "HTML5 templates", + "url": "https://jekyllrb.com/showcase", + "appearance": { + "iconUrl": "/imgs/logo/logo.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://jekyllrb.com/showcase/" + }, + "area": { + "type": "category", + "properties": { + "id": "77030622-1a31-43fe-9d0e-94442669a3dc" + } + }, + "shape": { + "lg": { + "location": { + "x": 0, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 2, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "3fd07e94-671f-4d82-81dd-294460f8fc20", + "name": "Neko", + "url": "http://192.168.1.150:8080", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/neko-light.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.150:8080/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 0, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 6, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 15 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "6310c150-0968-4561-9325-69d249417747", + "name": "ChatGPT", + "url": "https://chatgpt.com", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/chatgpt.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://chatgpt.com/" + }, + "area": { + "type": "category", + "properties": { + "id": "81cc4f36-2a5c-4813-9421-aaf163e76efd" + } + }, + "shape": { + "lg": { + "location": { + "x": 2, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 4, + "y": 0 + }, + "size": { + "width": 2, + "height": 2 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "74c77444-691a-4c5b-8099-b611ce3c3ac7", + "name": "Noted Apps", + "url": "https://noted.lol", + "appearance": { + "iconUrl": "/imgs/logo/logo.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://noted.lol/" + }, + "area": { + "type": "category", + "properties": { + "id": "7da95f8a-2915-4bca-80b5-973c2129eafc" + } + }, + "shape": { + "lg": { + "location": { + "x": 0, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 0, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 6 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "20400207-602a-4b81-83c8-a9501830227e", + "name": "https://jack-vanlightly.com/", + "url": "https://jack-vanlightly.com", + "appearance": { + "iconUrl": "/imgs/logo/logo.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://jack-vanlightly.com/" + }, + "area": { + "type": "category", + "properties": { + "id": "9687cffd-a1e0-446c-a3fc-8674e0f70d42" + } + }, + "shape": { + "lg": { + "location": { + "x": 0, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 1, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 1 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "e5884ea5-282b-431a-a02f-bc825ecee229", + "name": "HTML5 templates", + "url": "https://freehtml5.co", + "appearance": { + "iconUrl": "/imgs/logo/logo.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://freehtml5.co/" + }, + "area": { + "type": "category", + "properties": { + "id": "77030622-1a31-43fe-9d0e-94442669a3dc" + } + }, + "shape": { + "lg": { + "location": { + "x": 2, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 3, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 3 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "045e4b78-c1fa-4310-abb2-def26fb5d219", + "name": "Metube", + "url": "http://192.168.1.140:8081", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/metube.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.140:8081/" + }, + "area": { + "type": "category", + "properties": { + "id": "d81f31a5-ce58-4784-b580-8f56976ed1ee" + } + }, + "shape": { + "lg": { + "location": { + "x": 5, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 7, + "y": 2 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 16 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "d3ecd80b-80bc-41bc-9353-c6ca130b961c", + "name": "Youtube", + "url": "https://youtube.com", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/youtube.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://youtube.com" + }, + "area": { + "type": "category", + "properties": { + "id": "81cc4f36-2a5c-4813-9421-aaf163e76efd" + } + }, + "shape": { + "lg": { + "location": { + "x": 5, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 0, + "y": 0 + }, + "size": { + "width": 2, + "height": 2 + } + }, + "sm": { + "location": { + "x": 0, + "y": 4 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "c18858d2-53d9-40d9-8b36-eef2cd9b2cd1", + "name": "Usenetdeal", + "url": "https://usenetdeal.com/dashboard/usenet", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/homarr.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://usenetdeal.com/dashboard/usenet" + }, + "area": { + "type": "category", + "properties": { + "id": "7da95f8a-2915-4bca-80b5-973c2129eafc" + } + }, + "shape": { + "lg": { + "location": { + "x": 2, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 10, + "y": 0 + }, + "size": { + "width": 2, + "height": 2 + } + }, + "sm": { + "location": { + "x": 0, + "y": 5 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "183079de-96ef-4329-b695-fa30bc9a91b4", + "name": "https://juhache.substack.com/", + "url": "https://juhache.substack.com", + "appearance": { + "iconUrl": "/imgs/logo/logo.png", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://juhache.substack.com/" + }, + "area": { + "type": "category", + "properties": { + "id": "9687cffd-a1e0-446c-a3fc-8674e0f70d42" + } + }, + "shape": { + "lg": { + "location": { + "x": 1, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 0, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "61a3ea2f-518f-43df-8e9a-431f17e19596", + "name": "HTML5", + "url": "https://www.tooplate.com/free-templates", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/loganmarchione/homelab-svg-assets/assets/html5.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "https://www.tooplate.com/free-templates" + }, + "area": { + "type": "category", + "properties": { + "id": "77030622-1a31-43fe-9d0e-94442669a3dc" + } + }, + "shape": { + "lg": { + "location": { + "x": 3, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "md": { + "location": { + "x": 0, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + }, + "sm": { + "location": { + "x": 0, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + }, + { + "id": "9be593d8-a4b4-460a-8998-6cafefb4271e", + "name": "Home Control", + "url": "http://192.168.1.211:8765/dashboard#live", + "appearance": { + "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/crafty-controller.svg", + "appNameStatus": "normal", + "positionAppName": "column", + "lineClampAppName": 1, + "appNameFontSize": 16 + }, + "network": { + "enabledStatusChecker": true, + "statusCodes": [ + "200", + "301", + "302", + "304", + "307", + "308" + ] + }, + "behaviour": { + "isOpeningNewTab": true, + "externalUrl": "http://192.168.1.211:8765/dashboard#live" + }, + "area": { + "type": "category", + "properties": { + "id": "2ab74a15-f14c-46de-92b3-816337ef8b59" + } + }, + "shape": { + "lg": { + "location": { + "x": 0, + "y": 0 + }, + "size": { + "width": 1, + "height": 1 + } + } + }, + "integration": { + "type": null, + "properties": [] + } + } + ], + "widgets": [], + "settings": { + "common": { + "searchEngine": { + "type": "google", + "properties": {} + } + }, + "customization": { + "layout": { + "enabledLeftSidebar": false, + "enabledRightSidebar": false, + "enabledDocker": false, + "enabledPing": true, + "enabledSearchbar": true + }, + "pageTitle": "Mo's Dashboard", + "logoImageUrl": "/imgs/logo/logo.png", + "faviconUrl": "/imgs/favicon/favicon-squared.png", + "backgroundImageUrl": "", + "customCss": "", + "colors": { + "primary": "red", + "secondary": "yellow", + "shade": 7 + }, + "appOpacity": 100, + "gridstack": { + "columnCountSmall": 1, + "columnCountMedium": 16, + "columnCountLarge": 8 + }, + "backgroundImageAttachment": "fixed", + "backgroundImageRepeat": "no-repeat", + "backgroundImageSize": "cover", + "metaTitle": "" + }, + "access": { + "allowGuests": false + } + } +} \ No newline at end of file diff --git a/configs/homarr/isra.json b/configs/homarr/isra.json new file mode 100644 index 0000000..cd5b17c --- /dev/null +++ b/configs/homarr/isra.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "configProperties": { + "name": "isra" + }, + "categories": [ + { + "id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a33f", + "position": 1, + "name": "Welcome to Homarr 🎉" + } + ], + "wrappers": [ + { + "id": "default", + "position": 0 + }, + { + "id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a326", + "position": 1 + } + ], + "apps": [], + "widgets": [], + "settings": { + "common": { + "searchEngine": { + "type": "google", + "properties": {} + } + }, + "customization": { + "layout": { + "enabledLeftSidebar": false, + "enabledRightSidebar": false, + "enabledDocker": false, + "enabledPing": false, + "enabledSearchbar": true + }, + "pageTitle": "Homarr ⭐️", + "logoImageUrl": "/imgs/logo/logo.png", + "faviconUrl": "/imgs/favicon/favicon-squared.png", + "backgroundImageUrl": "", + "customCss": "", + "colors": { + "primary": "red", + "secondary": "yellow", + "shade": 7 + }, + "appOpacity": 100, + "gridstack": { + "columnCountSmall": 3, + "columnCountMedium": 6, + "columnCountLarge": 10 + } + }, + "access": { + "allowGuests": false + } + } +} \ No newline at end of file diff --git a/docker/adguard/docker-compose.yml b/docker/adguard/docker-compose.yml new file mode 100644 index 0000000..545edf4 --- /dev/null +++ b/docker/adguard/docker-compose.yml @@ -0,0 +1,21 @@ +# AdGuard Home — DNS + filtering (host network, poort 53 + web UI). +# Config: configs/adguard/AdGuardHome.yaml → mount naar /opt/adguardhome/conf + +services: + adguard: + image: adguard/adguardhome:latest + container_name: Adguard + restart: always + network_mode: host + volumes: + - ${ADGUARD_CONFIG_DIR:-/volume1/docker/Configs/adguard}:/opt/adguardhome/conf + - adguard-work:/opt/adguardhome/work + command: + - --no-check-update + - -c + - /opt/adguardhome/conf/AdGuardHome.yaml + - -w + - /opt/adguardhome/work + +volumes: + adguard-work: diff --git a/docker/duckdns/.env.example b/docker/duckdns/.env.example new file mode 100644 index 0000000..9b4ea9b --- /dev/null +++ b/docker/duckdns/.env.example @@ -0,0 +1,7 @@ +PUID=1026 +PGID=100 +TZ=Europe/Brussels +DUCKDNS_SUBDOMAINS=mohome020 +DUCKDNS_TOKEN=your-duckdns-token +DUCKDNS_UPDATE_IP=true +DUCKDNS_INTERVAL=300 diff --git a/docker/duckdns/docker-compose.yml b/docker/duckdns/docker-compose.yml new file mode 100644 index 0000000..cc833ac --- /dev/null +++ b/docker/duckdns/docker-compose.yml @@ -0,0 +1,16 @@ +# DuckDNS — dynamisch DNS voor mohome020.duckdns.org +# Start: cp .env.example .env && docker compose up -d + +services: + duckdns: + image: linuxserver/duckdns:latest + container_name: duckdns + restart: unless-stopped + environment: + PUID: ${PUID:-1026} + PGID: ${PGID:-100} + TZ: ${TZ:-Europe/Brussels} + SUBDOMAINS: ${DUCKDNS_SUBDOMAINS:?} + TOKEN: ${DUCKDNS_TOKEN:?} + UPDATE_IP: ${DUCKDNS_UPDATE_IP:-true} + INTERVAL: ${DUCKDNS_INTERVAL:-300} diff --git a/docker/ha-voice-control/docker-compose.yml b/docker/ha-voice-control/docker-compose.yml index 818b2ed..e4968ce 100644 --- a/docker/ha-voice-control/docker-compose.yml +++ b/docker/ha-voice-control/docker-compose.yml @@ -25,11 +25,11 @@ services: - PG_HOST=localhost - PG_PORT=5433 - PG_USER=mo - - PG_PASSWORD=${PG_PASSWORD:-WaQTUw2t} + - PG_PASSWORD=${PG_PASSWORD:?} - PG_DATABASE=homelab - NEO4J_URI=neo4j://localhost:49153 - NEO4J_USER=neo4j - - NEO4J_PASSWORD=${NEO4J_PASSWORD:-WaQTUw2t} + - NEO4J_PASSWORD=${NEO4J_PASSWORD:-} volumes: - whisper-cache:/root/.cache/huggingface diff --git a/docker/homarr/docker-compose.yml b/docker/homarr/docker-compose.yml new file mode 100644 index 0000000..55a3eb0 --- /dev/null +++ b/docker/homarr/docker-compose.yml @@ -0,0 +1,17 @@ +# Homarr — startdashboard (poort 4755). +# Configs: configs/homarr/ → /app/data/configs + +services: + homarr: + image: ghcr.io/ajnart/homarr:latest + container_name: homarr + restart: always + ports: + - "${HOMARR_PORT:-4755}:7575" + environment: + TZ: ${TZ:-Europe/Brussels} + volumes: + - ${HOMARR_CONFIG_DIR:-/volume1/docker/homarr}:/app/data/configs + - ${HOMARR_ICONS_DIR:-/volume1/docker/homarr/icons}:/app/public/icons + - ${HOMARR_DATA_DIR:-/volume1/docker/homarr/data}:/data + - /var/run/docker.sock:/var/run/docker.sock diff --git a/docker/homelab-command/README.md b/docker/homelab-command/README.md new file mode 100644 index 0000000..b6d2a12 --- /dev/null +++ b/docker/homelab-command/README.md @@ -0,0 +1,15 @@ +# Homelab Command + +Applicatiecode en monitoring-build staan in een aparte repo: + +- **Gitea:** http://192.168.1.211:3000/mo/homelab-command +- **NAS-pad:** `/volume1/homes/mo/homelab-command` + +```bash +git clone http://192.168.1.211:3000/mo/homelab-command.git /volume1/homes/mo/homelab-command +cd /volume1/homes/mo/homelab-command +cp .env.example .env # vul in +docker compose -f docker-compose.homelab.yml up -d --build +``` + +Zie ook `docker/monitoring/` in homelab-configs voor Prometheus/Grafana compose. diff --git a/docker/monitoring/README.md b/docker/monitoring/README.md new file mode 100644 index 0000000..8961167 --- /dev/null +++ b/docker/monitoring/README.md @@ -0,0 +1,16 @@ +# Monitoring (Prometheus + Grafana + postgres-exporter) + +Prometheus-config staat in deze map. **Grafana-image** en dashboards bouw je vanuit [homelab-command](http://192.168.1.211:3000/mo/homelab-command): + +```bash +cd /volume1/homes/mo/homelab-command +export PG_PASSWORD='...' +export GRAFANA_ADMIN_PASSWORD='...' +docker build -f Dockerfile.grafana -t grafana-homelab:latest . +docker compose -f docker-compose.grafana.yml up -d +# of: sh scripts/recreate_monitoring_docker.sh +``` + +Na start: `docker network create homelab-monitor` en verbind postgres-homelab, neo4j, prometheus, exporter, grafana. + +Mesh (NATS + normalizer): `docker compose -f docker-compose.mesh.yml --env-file .env up -d` in homelab-command. diff --git a/docker/monitoring/docker-compose.grafana.yml b/docker/monitoring/docker-compose.grafana.yml new file mode 100644 index 0000000..91255c6 --- /dev/null +++ b/docker/monitoring/docker-compose.grafana.yml @@ -0,0 +1,77 @@ +# Grafana — aparte stack (projectmap: homelab-command). +# +# Start (vanuit deze map): +# export PG_PASSWORD='jouw_postgres_wachtwoord' +# docker compose -f docker-compose.grafana.yml up -d --build +# +# UI: http://:3002 (standaard host-poort; 3001 was bezet op deze host) +# login: admin / GRAFANA_ADMIN_PASSWORD +# +# Vereist: postgres container heet postgres-homelab en luistert intern op 5432. +# Eénmalig (DNS tussen Prometheus en postgres-exporter op Synology bridge): +# sh scripts/docker_monitoring_join.sh homelab-monitor +# Daarna: docker network connect homelab-monitor postgres-homelab # als exporter DB niet bereikt +# +# Dashboards (Grafana.com IDs): PostgreSQL 9628, Proxmox 10347, Neo4j 10371, +# Synology overview 14364, Node Exporter 1860 — onder folder "Infrastructure". +# Prometheus scrape: postgres-exporter + optioneel Neo4j :2004 / Proxmox via targets/extra.yml. + +services: + prometheus: + image: prom/prometheus:v2.53.2 + container_name: prometheus-homelab + restart: unless-stopped + ports: + - "${PROMETHEUS_PORT:-9090}:9090" + volumes: + - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro + - ./prometheus/targets:/etc/prometheus/targets:ro + - prometheus-homelab-data:/prometheus + command: + - --config.file=/etc/prometheus/prometheus.yml + - --storage.tsdb.path=/prometheus + - --web.enable-lifecycle + networks: + - homelab-monitor + + postgres-exporter: + image: prometheuscommunity/postgres-exporter:latest + container_name: postgres-exporter-homelab + restart: unless-stopped + ports: + - "${POSTGRES_EXPORTER_PORT:-9187}:9187" + environment: + DATA_SOURCE_NAME: "postgresql://${PG_USER:-mo}:${PG_PASSWORD}@postgres-homelab:5432/${PG_DATABASE:-homelab}?sslmode=disable" + networks: + - homelab-monitor + + grafana: + # Bouw image vanuit homelab-command repo (zie docker/monitoring/README.md) + image: grafana-homelab:latest + container_name: grafana-homelab + restart: unless-stopped + ports: + - "${GRAFANA_PORT:-3002}:3000" + environment: + GF_SECURITY_ADMIN_USER: ${GRAFANA_ADMIN_USER:-admin} + GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD:-changeme_grafana} + GF_USERS_DEFAULT_THEME: dark + GF_SERVER_ROOT_URL: ${GRAFANA_ROOT_URL:-http://localhost:3002} + PG_USER: ${PG_USER:-mo} + PG_DATABASE: ${PG_DATABASE:-homelab} + HOMELAB_PG_PASSWORD: ${PG_PASSWORD:-} + volumes: + - grafana-homelab-data:/var/lib/grafana + # Grafana provisioning/dashboards: clone homelab-command en mount paden daar + depends_on: + - prometheus + networks: + - homelab-monitor + +volumes: + grafana-homelab-data: + prometheus-homelab-data: + +networks: + homelab-monitor: + driver: bridge diff --git a/docker/monitoring/docker-compose.mesh.yml b/docker/monitoring/docker-compose.mesh.yml new file mode 100644 index 0000000..3d4d4bb --- /dev/null +++ b/docker/monitoring/docker-compose.mesh.yml @@ -0,0 +1,31 @@ +# Security Mesh stack — NATS + Go-normalizer (Zeek/Suricata JSON → Postgres). +# Start vanuit homelab-command: docker compose -f docker-compose.mesh.yml --env-file .env.mesh up -d +# Stop bestaande NATS op poort 4222 of wijzig poorten hieronder. + +services: + nats: + image: nats:2.10-alpine + command: ["-js", "-m", "8222"] + ports: + - "${NATS_CLIENT_PORT:-4222}:4222" + - "${NATS_HTTP_PORT:-8222}:8222" + restart: unless-stopped + + mesh-normalizer: + image: mesh-normalizer:local + build: + context: ./mesh-ingest + dockerfile: Dockerfile + environment: + NATS_URL: nats://nats:4222 + MESH_DEFAULT_TENANT_ID: ${MESH_DEFAULT_TENANT_ID:-00000000-0000-4000-8000-000000000001} + PG_HOST: ${PG_HOST:-172.17.0.1} + PG_PORT: ${PG_PORT:-5433} + PG_USER: ${PG_USER:-mo} + PG_PASSWORD: ${PG_PASSWORD:-} + PG_DATABASE: ${PG_DATABASE:-homelab} + depends_on: + - nats + restart: unless-stopped + extra_hosts: + - "host.docker.internal:host-gateway" diff --git a/docker/monitoring/prometheus.yml b/docker/monitoring/prometheus.yml new file mode 100644 index 0000000..a7994a6 --- /dev/null +++ b/docker/monitoring/prometheus.yml @@ -0,0 +1,44 @@ +# Prometheus — scrape targets op Docker bridge (naast postgres-homelab, neo4j, …). +global: + scrape_interval: 15s + evaluation_interval: 15s + +scrape_configs: + - job_name: prometheus + static_configs: + - targets: ["localhost:9090"] + + - job_name: postgres-exporter + static_configs: + - targets: ["postgres-exporter-homelab:9187"] + labels: + instance: postgres-homelab + + # Neo4j 4.4+ enterprise metrics.prometheus.enabled → endpoint op poort 2004 + - job_name: neo4j + scrape_interval: 30s + metrics_path: /metrics + static_configs: + - targets: ["neo4j:2004"] + labels: + instance: neo4j + + # Proxmox VE — prometheus-pve-exporter; vul monitoring/prometheus/targets/extra.yml + - job_name: proxmox-pve + scrape_interval: 30s + file_sd_configs: + - files: + - /etc/prometheus/targets/extra.yml + refresh_interval: 1m + + # Synology / SNMP: zet targets in monitoring/prometheus/targets/snmp.yml en uncomment hieronder. + # - job_name: snmp + # scrape_interval: 60s + # metrics_path: /snmp + # params: + # module: [synology] + # static_configs: + # - targets: + # - 192.168.1.211 + # labels: + # job: snmp-nas diff --git a/docker/monitoring/prometheus/targets/extra.yml b/docker/monitoring/prometheus/targets/extra.yml new file mode 100644 index 0000000..d4813e8 --- /dev/null +++ b/docker/monitoring/prometheus/targets/extra.yml @@ -0,0 +1,9 @@ +# Voeg hier scrape-targets toe (YAML array van scrape_configs entries wordt NIET ondersteund — +# dit bestand is voor **file_sd** formaat: lijst van static_configs targets). +# +# Voorbeeld Proxmox (prometheus-pve-exporter op host of VM): +# - targets: +# - '192.168.1.10:9221' +# labels: +# instance: pve +[] \ No newline at end of file diff --git a/docker/monitoring/prometheus/targets/extra.yml.example b/docker/monitoring/prometheus/targets/extra.yml.example new file mode 100644 index 0000000..89fa94f --- /dev/null +++ b/docker/monitoring/prometheus/targets/extra.yml.example @@ -0,0 +1,7 @@ +# Hernoem naar extra.yml of merge handmatig. Formaat: lijst van static config groepen. +# +# Proxmox VE exporter (github.com/prometheus-pve/prometheus-pve-exporter): +- targets: + - "192.168.1.50:9221" + labels: + instance: proxmox diff --git a/docker/monitoring/prometheus/targets/snmp.yml b/docker/monitoring/prometheus/targets/snmp.yml new file mode 100644 index 0000000..dfc5759 --- /dev/null +++ b/docker/monitoring/prometheus/targets/snmp.yml @@ -0,0 +1,2 @@ +# SNMP exporter targets (Synology via snmp_exporter). Leeg = geen scrapes. +[] \ No newline at end of file diff --git a/docker/monitoring/prometheus/targets/snmp.yml.example b/docker/monitoring/prometheus/targets/snmp.yml.example new file mode 100644 index 0000000..9b2baf8 --- /dev/null +++ b/docker/monitoring/prometheus/targets/snmp.yml.example @@ -0,0 +1,5 @@ +# snmp_exporter (poort 9116) die naar je Synology SNMP wijst. +- targets: + - "snmp-exporter:9116" + labels: + job: synology diff --git a/docker/neo4j/docker-compose.yml b/docker/neo4j/docker-compose.yml new file mode 100644 index 0000000..636e139 --- /dev/null +++ b/docker/neo4j/docker-compose.yml @@ -0,0 +1,16 @@ +# Neo4j — graph database (bolt 49153, browser 49154/49155). +# Data: /volume1/docker/neo4j + +services: + neo4j: + image: neo4j:latest + container_name: neo4j + restart: unless-stopped + ports: + - "${NEO4J_BOLT_PORT:-49153}:7687" + - "${NEO4J_HTTP_PORT:-49154}:7474" + - "${NEO4J_HTTPS_PORT:-49155}:7473" + environment: + NEO4J_AUTH: ${NEO4J_AUTH:-neo4j/changeme} + volumes: + - ${NEO4J_DATA_DIR:-/volume1/docker/neo4j}:/data diff --git a/docker/portainer/docker-compose.yml b/docker/portainer/docker-compose.yml new file mode 100644 index 0000000..c73ae08 --- /dev/null +++ b/docker/portainer/docker-compose.yml @@ -0,0 +1,13 @@ +# Portainer CE — Docker UI (poorten 8000, 9000). + +services: + portainer: + image: portainer/portainer-ce:latest + container_name: portainer + restart: always + ports: + - "${PORTAINER_EDGE:-8000}:8000" + - "${PORTAINER_HTTP:-9000}:9000" + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ${PORTAINER_DATA_DIR:-/volume1/docker/portainer}:/data diff --git a/docker/postgres-web/docker-compose.yml b/docker/postgres-web/docker-compose.yml index 833d24a..ee08e23 100644 --- a/docker/postgres-web/docker-compose.yml +++ b/docker/postgres-web/docker-compose.yml @@ -18,7 +18,7 @@ services: environment: # Standaard inlog voor de web UI - PGADMIN_DEFAULT_EMAIL=mo@el-kadi.nl - - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_PASSWORD:-WaQTUw2t} + - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_PASSWORD:?Zet PGADMIN_PASSWORD in .env} # Masquerade root URL voor nginx reverse proxy - PGADMIN_CONFIG_SERVER_MODE=True - PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED=False diff --git a/docker/postgres-web/servers.json b/docker/postgres-web/servers.json index aee57ca..f3c9e11 100644 --- a/docker/postgres-web/servers.json +++ b/docker/postgres-web/servers.json @@ -7,7 +7,7 @@ "Port": 5433, "MaintenanceDB": "homelab", "Username": "mo", - "Password": "WaQTUw2t", + "Password": "", "SSLMode": "prefer", "PassFile": "", "SSLCert": "", diff --git a/docker/postgres-web/servers.json.example b/docker/postgres-web/servers.json.example new file mode 100644 index 0000000..59a0cdf --- /dev/null +++ b/docker/postgres-web/servers.json.example @@ -0,0 +1,15 @@ +{ + "Servers": { + "1": { + "Name": "Homelab PostgreSQL", + "Group": "Servers", + "Host": "192.168.1.211", + "Port": 5433, + "MaintenanceDB": "homelab", + "Username": "mo", + "Password": "VUL_IN_PGADMIN_UI", + "SSLMode": "prefer", + "Comment": "Synology NAS — Homelab dashboard database" + } + } +} diff --git a/docker/postgres/.env.example b/docker/postgres/.env.example new file mode 100644 index 0000000..2f03021 --- /dev/null +++ b/docker/postgres/.env.example @@ -0,0 +1,5 @@ +POSTGRES_USER=mo +POSTGRES_PASSWORD=changeme +POSTGRES_DB=homelab +PG_HOST_PORT=5433 +PG_DATA_DIR=/volume1/docker/postgres/data diff --git a/docker/postgres/docker-compose.yml b/docker/postgres/docker-compose.yml new file mode 100644 index 0000000..7d1fd2d --- /dev/null +++ b/docker/postgres/docker-compose.yml @@ -0,0 +1,17 @@ +# PostgreSQL — centrale homelab-database (poort 5433 op host). +# NAS-pad: /volume1/docker/postgres/ +# Start: cp .env.example .env && docker compose up -d + +services: + postgres-homelab: + image: postgres:16-alpine + container_name: postgres-homelab + restart: unless-stopped + ports: + - "${PG_HOST_PORT:-5433}:5432" + environment: + POSTGRES_USER: ${POSTGRES_USER:-mo} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Zet POSTGRES_PASSWORD in .env} + POSTGRES_DB: ${POSTGRES_DB:-homelab} + volumes: + - ${PG_DATA_DIR:-/volume1/docker/postgres/data}:/var/lib/postgresql/data diff --git a/docker/remotely/docker-compose.yml b/docker/remotely/docker-compose.yml new file mode 100644 index 0000000..758423e --- /dev/null +++ b/docker/remotely/docker-compose.yml @@ -0,0 +1,11 @@ +# Remotely — remote support (poort 8080). + +services: + remotely: + image: immybot/remotely:latest + container_name: remotely + restart: always + ports: + - "${REMOTELY_PORT:-8080}:8080" + volumes: + - ${REMOTELY_CONFIG_DIR:-/volume1/docker/remotely}:/config diff --git a/scripts/sync-from-nas.sh b/scripts/sync-from-nas.sh new file mode 100644 index 0000000..f4edbd1 --- /dev/null +++ b/scripts/sync-from-nas.sh @@ -0,0 +1,38 @@ +#!/bin/sh +# Kopieer actuele NAS-configs naar deze git-repo (draai vóór commit). +set -e +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +NAS_DOCKER="${NAS_DOCKER:-/volume1/docker}" +NAS_HOMELAB="${NAS_HOMELAB:-/volume1/homes/mo/homelab-command}" + +echo "Sync → $ROOT" + +# Homarr dashboards +mkdir -p "$ROOT/configs/homarr" +cp -f "$NAS_DOCKER/homarr"/*.json "$ROOT/configs/homarr/" 2>/dev/null || true + +# AdGuard (config zit vaak in container; export als map leeg is) +mkdir -p "$ROOT/configs/adguard" +if docker ps --format '{{.Names}}' | grep -qx Adguard; then + docker cp Adguard:/opt/adguardhome/conf/AdGuardHome.yaml "$ROOT/configs/adguard/AdGuardHome.yaml" +fi + +# Prometheus targets + compose bron +if [ -d "$NAS_HOMELAB/monitoring" ]; then + cp -f "$NAS_HOMELAB/monitoring/prometheus.yml" "$ROOT/docker/monitoring/" + cp -rf "$NAS_HOMELAB/monitoring/prometheus/targets/"* "$ROOT/docker/monitoring/prometheus/targets/" 2>/dev/null || true + cp -f "$NAS_HOMELAB/docker-compose.grafana.yml" "$ROOT/docker/monitoring/" + cp -f "$NAS_HOMELAB/docker-compose.mesh.yml" "$ROOT/docker/monitoring/" +fi + +# Live compose uit docker-mappen (bron van waarheid op NAS) +for svc in gitea postgres-web excalidraw guacamole wazuh ha-voice-control; do + src="$NAS_DOCKER/$svc/docker-compose.yml" + dst="$ROOT/docker/$svc/docker-compose.yml" + if [ -f "$src" ]; then + mkdir -p "$(dirname "$dst")" + cp -f "$src" "$dst" + fi +done + +echo "Klaar. Controleer: git status && git diff"