{"id":28480526,"url":"https://github.com/borjaip/homelab","last_synced_at":"2026-05-06T18:35:38.961Z","repository":{"id":293358835,"uuid":"983740166","full_name":"BorjaIP/homelab","owner":"BorjaIP","description":"🧬 Homelab 🖥","archived":false,"fork":false,"pushed_at":"2025-05-31T22:32:54.000Z","size":76,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-03T19:46:01.039Z","etag":null,"topics":["arr","docker","homelab","homelab-automation","homelab-media","homelab-setup","k8s","kubernetes","packer","proxmox","terraform","traefik"],"latest_commit_sha":null,"homepage":"","language":"HCL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BorjaIP.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-14T20:58:28.000Z","updated_at":"2025-05-31T22:32:57.000Z","dependencies_parsed_at":"2025-05-15T00:21:27.366Z","dependency_job_id":"0dbe3de6-3589-4aa6-bf8d-4b64390cb786","html_url":"https://github.com/BorjaIP/homelab","commit_stats":null,"previous_names":["borjaip/homelab"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/BorjaIP/homelab","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BorjaIP%2Fhomelab","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BorjaIP%2Fhomelab/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BorjaIP%2Fhomelab/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BorjaIP%2Fhomelab/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BorjaIP","download_url":"https://codeload.github.com/BorjaIP/homelab/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BorjaIP%2Fhomelab/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268326739,"owners_count":24232496,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-02T02:00:12.353Z","response_time":74,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arr","docker","homelab","homelab-automation","homelab-media","homelab-setup","k8s","kubernetes","packer","proxmox","terraform","traefik"],"created_at":"2025-06-07T19:06:42.523Z","updated_at":"2026-05-06T18:35:38.914Z","avatar_url":"https://github.com/BorjaIP.png","language":"HCL","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003e Homelab\u003c/h1\u003e\n  \u003cp\u003e\u003cstrong\u003eA fully automated, themed homelab built with Proxmox, Terraform, and Docker.\u003c/strong\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n---\n- [🔧 System Configuration](#-system-configuration)\n- [🔑 SSH Key \\\u0026 Certificate Generation](#-ssh-key--certificate-generation)\n- [🌐 Proxy Configuration (Traefik)](#-proxy-configuration-traefik)\n- [📁 NFS Configuration](#-nfs-configuration)\n  - [Optional - Share Storage](#optional---share-storage)\n  - [1. Install NFS Server](#1-install-nfs-server)\n  - [2. Add NFS Storage to Proxmox](#2-add-nfs-storage-to-proxmox)\n- [🧱 Base VMs with Packer](#-base-vms-with-packer)\n- [🚀 VM Deployment with Terraform](#-vm-deployment-with-terraform)\n- [⚙️ Configuration](#️-configuration)\n  - [Transmission and OpenVPN](#transmission-and-openvpn)\n  - [Home Assistant](#home-assistant)\n  - [Windows Share with Rclone](#windows-share-with-rclone)\n- [🔗 References](#-references)\n\nThis homelab infrastructure is centered on **Proxmox VE** using **Terraform** and **Docker** to provision VMs and Dockers (*names based in the Angels from Neon Genesis Evangelion*). Each VM serves a specific purpose like media, storage, or network automation.\n\n## 🔧 System Configuration\n\n\u003e Refer to the table below for an at-a-glance view of each configured and planned virtual machine and its corresponding role.\n\nThese steps are tailored specifically to my homelab infrastructure. Some assumptions are made (like Proxmox being pre-installed), and tools are selected based on personal preference and workflow. Your configuration may vary depending on your hardware, network design, and requirements.\n\n- [Proxmox VE](https://proxmox.com/en/products/proxmox-virtual-environment/get-started) is already installed and fully configured in this environment.\n- Create new SSH Key for setup conectivity.\n- Use [Proxmox VE Helper Scripts](https://community-scripts.github.io/ProxmoxVE/) for community-contributed helper scripts for VM management, backups, and more.\n- Setup [Traefik](https://github.com/traefik/traefik) as a reverse proxy to handle and redirect HTTP/S traffic.\n\n## 🔑 SSH Key \u0026 Certificate Generation\n\nGenerate an SSH key for your vm's or other services:\n\n```bash\nssh-keygen -t ed25519 -C \"server\"\n```\n\nUse the generated public key in `user-data` for automatic authentication setup.\n\n## 🌐 Proxy Configuration (Traefik)\n\nUsing [traefik-kop](https://github.com/jittering/traefik-kop), each VM runs an agent that:\n\n- Registers itself with the main Traefik instance\n- Sends its routing configuration dynamically\n\nThis enables:\n\n- Auto-discovery of services\n- Clean URLs and HTTPS support\n- Centralized control over routing logic\n\n```text\n                       \n                      +-------------------------+         +---------------------0----+\n                      | +---------------------+ |         | +---------------------+  |\n                      | |                     | |         | |                     |  |\n+---------+     :443  | |  +---------+        | | :8088   | |  +------------+     |  |\n|   WAN   |---------------\u003e| traefik |\u003c--------------------\u003e|  | svc-nginx  |     |  |\n+---------+           | |  +---------+        | |         | |  +------------+     |  |\n                      | |       |             | |         | |                     |  |\n                      | |  +---------+        | |         | |  +-------------+    |  |\n                      | |  |  redis  |\u003c--------------------\u003e|  | traefik-kop |    |  |\n                      | |  +---------+        | |         | |  +-------------+    |  |\n                      | |             docker1 | |         | |             docker2 |  |\n                      | +---------------------+ |         | +---------------------+  |\n                      |                     vm1 |         |                    vm2   |\n                      +-------------------------+         +--------------------------+\n```\n\n## 📁 NFS Configuration\n\n### Optional - Share Storage\n\n\u003e [!Note]\n\u003e ⚠️ NTFS support is functional but comes with performance and permission caveats—consider ext4/ZFS for native setups.\n\nTo consolidate data across VMs, I export a shared storage path via NFS, backed by an NTFS-formatted disk. While not typical in Linux-first setups, this suits my personal needs.\n\n```bash\nsudo apt install -y ntfs-3g\n```\n\nList all the devices and select which one you need to mount.\n\n```bash\nsudo fdisk -l\nsudo lsblk -f\nls -l /dev/disk/by-uuid/\n```\n\nCopy the UUID in /etc/fstab\n\n```bash\n# edit fstab\nvim /etc/fstab\nUUID=\"\" /mnt/storage ntfs-3g defaults,auto 0 0\nmkdir /mnt/storage\n# mount disc\nmount -a\n```\n\n- Add disk to VM.\n\n```bash\nls -l /dev/disk/by-id/\nqm set 103 -virtio2 /dev/disk/by-id/\u003cdisk-id\u003e\n```\n\n### 1. Install NFS Server\n\n```bash\nsudo apt install -y nfs-kernel-server\nsudo vim /etc/exports\n```\n\nExample export entry:\n\n```bash\n/mnt/storage 192.168.1.0/24(rw,sync,no_subtree_check)\n```\n\n\u003e - Replace 192.168.1.0/24 with the subnet of your Proxmox server (e.g., 192.168.1.0/24 allows all IPs in the 192.168.1.x range).\n\u003e - rw: Allows read and write access.\n\u003e - sync: Ensures changes are written to disk before the client is notified.\n\u003e - no_subtree_check: Prevents subtree checking for better performance.\n\n### 2. Add NFS Storage to Proxmox\n\n1. Login to Proxmox Web UI\n2. Navigate to `Datacenter \u003e Storage \u003e Add \u003e NFS`\n3. Fill in:\n\n    * **ID**: Enter a name for the storage (e.g., nfs-storage).\n    * **Server**: Enter the IP address of the NFS server (e.g., 192.168.1.111).\n    * **Export**: Click Query to list available NFS exports, and select /mnt/storage.\n    * **Content**: Select the types of content you want to store (e.g., Disk image, ISO image, Backup).\n    * **Nodes**: Select the Proxmox nodes that can access this storage.\n\n## 🧱 Base VMs with Packer\n\n\u003e [!Warning]\n\u003e ⚠️ To be able to run packer from WSL2 you need to change the network mode.\n\nAll virtual machines are built from a [cloud-init](https://cloudinit.readthedocs.io/en/latest/index.html) Ubuntu 24.04 image using Packer. This ensures consistency across deployments.\n\nConfigure `variables.auto.pkrvars.hcl` file for custom values.\n\n```bash\ncd packer\npacker validate .\npacker build .\n```\n\n- The resulting image is uploaded to Proxmox as a VM template.\n- Cloud-init is enabled in the build to support dynamic configuration.\n- Include Docker installation an other tools.\n- This template is later used by Terraform to deploy actual VMs.\n\n## 🚀 VM Deployment with Terraform\n\nDeploy or destroy VMs using Terraform's targeted apply.\n\nEnsure that your `terraform.tfvars` and modules are configured per [Proxmox Provider](https://registry.terraform.io/providers/Telmate/proxmox/latest/docs) standards.\n\n```bash\ncd terraform\nterraform plan\nterraform apply\n# or \nterraform apply -target='module.vms[\"ramiel\"]'\nterraform destroy -target='module.vms[\"ramiel\"]'\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003ch2\u003e📦 VMs\u003c/h2\u003e\n\u003c/div\u003e\n\n\u003cdiv style=\"display: flex; justify-content: center; width: 100%;\"\u003e\n  \u003ctable style=\"width: 100%; max-width: 1000px; border-collapse: collapse; font-family: sans-serif; font-size: 14px;\"\u003e\n    \u003cthead\u003e\n      \u003ctr style=\"\"\u003e\n        \u003cth style=\"padding: 8px; border: 1px solid #ccc;\"\u003eThumbnail\u003c/th\u003e\n        \u003cth style=\"padding: 8px; border: 1px solid #ccc;\"\u003eVM Name\u003c/th\u003e\n        \u003cth style=\"padding: 8px; border: 1px solid #ccc;\"\u003eID\u003c/th\u003e\n        \u003cth style=\"padding: 8px; border: 1px solid #ccc;\"\u003eCategory\u003c/th\u003e\n        \u003cth style=\"padding: 8px; border: 1px solid #ccc;\"\u003eServices/Tools\u003c/th\u003e\n      \u003c/tr\u003e\n    \u003c/thead\u003e\n    \u003ctbody\u003e\n      \u003ctr\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003e\u003cimg src=\"https://wiki.evageeks.org/images/thumb/e/e8/OP_angel_sachiel_face_clean.jpg/300px-OP_angel_sachiel_face_clean.jpg\" width=\"64\" /\u003e\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eAdam\u003c/td\u003e\n        \u003cth style=\"padding: 8px; border: 1px solid #ccc;\"\u003e201\u003c/th\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eProxmox Host\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eProxmox VE\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003e\u003cimg src=\"https://wiki.evageeks.org/images/thumb/e/e1/M25_Lilith_Cross_Ritsuko.jpg/175px-M25_Lilith_Cross_Ritsuko.jpg\" width=\"64\" /\u003e\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eLilith\u003c/td\u003e\n        \u003cth style=\"padding: 8px; border: 1px solid #ccc;\"\u003e202\u003c/th\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eStorage\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eTrueNAS*\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003e\u003cimg src=\"https://wiki.evageeks.org/images/thumb/d/d9/Sachiel_Monitor.jpg/175px-Sachiel_Monitor.jpg\" width=\"64\" /\u003e\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eSachiel\u003c/td\u003e\n        \u003cth style=\"padding: 8px; border: 1px solid #ccc;\"\u003e203\u003c/th\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eMedia Server\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003ePlex / Jellyfin / Plextraktsync / Navidrome\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003e\u003cimg src=\"https://wiki.evageeks.org/images/thumb/e/ec/03_C208_shamshel-comp_crop.jpg/150px-03_C208_shamshel-comp_crop.jpg\" width=\"64\" /\u003e\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eShamshel\u003c/td\u003e\n        \u003cth style=\"padding: 8px; border: 1px solid #ccc;\"\u003e204\u003c/th\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eArr Stack\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eSonarr / Radarr / Lidarr / Prowlarr / Overseerr\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003e\u003cimg src=\"https://wiki.evageeks.org/images/thumb/7/75/Ramiel_110.jpg/175px-Ramiel_110.jpg\" width=\"64\" /\u003e\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eRamiel\u003c/td\u003e\n        \u003cth style=\"padding: 8px; border: 1px solid #ccc;\"\u003e205\u003c/th\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eDownloaders\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eTransmission\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003e\u003cimg src=\"https://wiki.evageeks.org/images/thumb/4/4c/Ep08_gaghiel.jpg/175px-Ep08_gaghiel.jpg\" width=\"64\" /\u003e\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eGaghiel\u003c/td\u003e\n        \u003cth style=\"padding: 8px; border: 1px solid #ccc;\"\u003e206\u003c/th\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eReverse Proxy and Tunnels\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eTraefik / CloudflareTunnels\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003e\u003cimg src=\"https://wiki.evageeks.org/images/thumb/8/8d/09_C346_israfel-2jump.jpg/175px-09_C346_israfel-2jump.jpg\" width=\"64\" /\u003e\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eIsrafel\u003c/td\u003e\n        \u003cth style=\"padding: 8px; border: 1px solid #ccc;\"\u003e207\u003c/th\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eNFS Server\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eNFS*\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003e\u003cimg src=\"https://wiki.evageeks.org/images/thumb/6/6d/Ep10_sandalphon.jpg/175px-Ep10_sandalphon.jpg\" width=\"64\" /\u003e\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eSandalphon\u003c/td\u003e\n        \u003cth style=\"padding: 8px; border: 1px solid #ccc;\"\u003e208\u003c/th\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eNetwork tools\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eGluetun / Flaresolverr\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003e\u003cimg src=\"https://wiki.evageeks.org/images/thumb/2/28/11_C337_matarael.jpg/175px-11_C337_matarael.jpg\" width=\"64\" /\u003e\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eMatarael\u003c/td\u003e\n        \u003cth style=\"padding: 8px; border: 1px solid #ccc;\"\u003e209\u003c/th\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eDashboards\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eHomepage / Homarr / Homer\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003e\u003cimg src=\"https://wiki.evageeks.org/images/thumb/a/a0/12_C250_sahaquiel.jpg/175px-12_C250_sahaquiel.jpg\" width=\"64\" /\u003e\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eSahaquiel\u003c/td\u003e\n        \u003cth style=\"padding: 8px; border: 1px solid #ccc;\"\u003e210\u003c/th\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eMonitoring\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eUptimekuma / Dozzle\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003e\u003cimg src=\"https://wiki.evageeks.org/images/thumb/2/2e/Ep13_ireul_pribnowbox.jpg/175px-Ep13_ireul_pribnowbox.jpg\" width=\"64\" /\u003e\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eIreul\u003c/td\u003e\n        \u003cth style=\"padding: 8px; border: 1px solid #ccc;\"\u003e211\u003c/th\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eUtilities\u003c/td\u003e\n        \u003ctd style=\"padding: 8px; border: 1px solid #ccc;\"\u003eHome Assistant / Immich / Paperless\u003c/td\u003e\n      \u003c/tr\u003e\n    \u003c/tbody\u003e\n  \u003c/table\u003e\n\u003c/div\u003e\n\n[*]: *Future changes or upgrades.*\n\n## ⚙️ Configuration\n\n### Transmission and OpenVPN\n\n- For testing Transmission with OpenVPN add this torrent from [TorGuard](https://torguard.net/checkmytorrentipaddress.php?hash=f1f5bda133bdbb4743773cc8548cbaee1fbff88a).\n\n### Home Assistant\n\n- Setup [HACS](https://hacs.xyz/docs/use/download/download/)\n- Setup IKEA [Dirigera](https://github.com/sanjoyg/dirigera_platform)\n\n### Windows Share with Rclone\n\n- Install [Rclone](https://rclone.org/install/)\n\n```bash\n# Installing\nwinget install --id=Rclone.Rclone -e\n# Setup new SFTP connection\nrclone config\n# Show all volumes\nrclone listremotes\n# Mount\nrclone mount nas:/mnt/storage X: --vfs-cache-mode full --vfs-cache-max-size 2G --vfs-read-chunk-size 64M --vfs-read-chunk-size-limit 512M --buffer-size 32M --attr-timeout 1s --no-modtime --network-mode --dir-cache-time 5m --poll-interval 10s --log-level INFO\n```\n\n- Copy files\n\n```bash\nrclone copy \"F:/\" nas:\"/mnt/storage/backup/\" --progress\n```\n\n## 🔗 References\n\n* [Proxmox Packer Templates](https://github.com/sdhibit/packer-proxmox-templates)\n* [Terraform Cloud-Init VM](https://github.com/sdhibit/terraform-proxmox-cloud-init-vm)\n* [Telmate Terraform Provider](https://github.com/Telmate/terraform-provider-proxmox)\n* [Proxmox Ubuntu Templates](https://github.com/bcochofel/packer-proxmox-ubuntu)\n* [Proxmox-VM-Disk-and-NFS-Configuration-Guide](https://github.com/Ayman92M/Proxmox-VM-Disk-and-NFS-Configuration-Guide)\n* [Evangelion Angel Wiki](https://wiki.evageeks.org/Angels)\n\n---\n\n\u003cdiv align=\"center\"\u003e\n  \u003csub\u003e✦ Inspired by Evangelion. Built for learning, automation, and chaos. ✦\u003c/sub\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fborjaip%2Fhomelab","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fborjaip%2Fhomelab","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fborjaip%2Fhomelab/lists"}