{"id":16242406,"url":"https://github.com/rodneyosodo/homelab","last_synced_at":"2025-03-16T12:32:49.507Z","repository":{"id":220652392,"uuid":"738630938","full_name":"rodneyosodo/homelab","owner":"rodneyosodo","description":"This is my entire homelab documentation files","archived":false,"fork":false,"pushed_at":"2025-03-02T20:48:19.000Z","size":12992,"stargazers_count":6,"open_issues_count":10,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-14T16:50:49.220Z","etag":null,"topics":["docker","homelab","self-hosted"],"latest_commit_sha":null,"homepage":"","language":"HCL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rodneyosodo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2024-01-03T17:11:40.000Z","updated_at":"2025-03-02T20:48:22.000Z","dependencies_parsed_at":"2024-03-22T23:28:29.980Z","dependency_job_id":"e4155913-25f9-4e6e-a185-2e31dc8267e0","html_url":"https://github.com/rodneyosodo/homelab","commit_stats":null,"previous_names":["rodneyosodo/homelab"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodneyosodo%2Fhomelab","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodneyosodo%2Fhomelab/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodneyosodo%2Fhomelab/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodneyosodo%2Fhomelab/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rodneyosodo","download_url":"https://codeload.github.com/rodneyosodo/homelab/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243814884,"owners_count":20352055,"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","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":["docker","homelab","self-hosted"],"created_at":"2024-10-10T14:10:54.162Z","updated_at":"2025-03-16T12:32:49.499Z","avatar_url":"https://github.com/rodneyosodo.png","language":"HCL","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Rodney Osodo's Homelab\n\nHello, I'm [Rodney Osodo][website] [@blackd0t][twitter] on Twitter. I'm a software engineer and homelab. I use it to learn new technologies and to host myprojects and other services. This repository contains the configuration files for my homelab.\n\n## Goals\n\n- [ ] De-google my life.\n- [ ] To eventually provide a highly available and scalable infrastructure for my projects and services with no single point of failure.\n- [x] Learn new technologies.\n- [x] Have fun.\n\n## Hardware\n\nI have a single server running Proxmox VE 6.5.11-7-pve with the following specs:\n\n- CPU: AMD Ryzen 7 4800H with Radeon Graphics (16) @ 1.4GHz - 2.9GHz\n- RAM: 32 GB DDR4-3200 Memory\n- SSD: 1x 1 TB NVMe SSD\n- Disk: 1x 2 TB SATA SSD\n\nI have a 20 Mbps uplink and a 20 Mbps downlink internet connection from Safaricom (planning to upgrade depending on upload usage). I don't have a static IP address so I use [cloudflare-tunnel][cft] to expose my services to the internet.\n\nI also have a Raspberry Pi 4 Model B with 4 GB RAM which is not running since I have a few issues with running proxmox backup server on it. I had a backup 4TB HDD connected to it but it had 4096 bytes per sector and proxmox backup server only supports 512 bytes per sector. I'm planning to get a new HDD and try again with a mini PC instead of the Raspberry Pi. Another issue is that the proxmox backup server doesn't support ARM64 architecture.\n\nSome photos of my homelab:\n\n![computers][computers]\n\n![odin-server][odin-image]\n\nMore photos can be found in this [Immich-photo-album][Immich-photo-album].\n\n## Software\n\nI use Proxmox VE as my hypervisor. I currently have 1 VM running Debian 12 (Bookworm) which is my main server. Based on some viewpoints from the [Linux Unplugged][linux-unplugged] podcast, I'm planning to move to Debian as my main OS because proxmos is based on Debian and I can use the same tools on both the host and the VMs or use Arch Linux as my main OS because of the rolling release model because I use it on my workstation. I'm still undecided on which one to use.\n\nI use ZFS for my storage. I have a single pool made up of 1x 2 TB SSD. I'm planning to add another pool for my backups. Currently, backups are stored on the SSD which hosts the OS.\n\n![proxmox-dashboard][proxmox-dashboard]\n\n## Services\n\nI use the following services:\n\n![services][services]\n\n### portainer\n\nPortainer is a lightweight management UI that allows me to easily manage my different Docker environments (Docker hosts or containers). It is meant to be as simple to deploy as it is to use.\n\nMy portainer configuration files can be found in the [portainer-compose][portainer-compose] directory.\n\n![portainer dashboard][portainer-dashboard]\n\n### uptime-kuma\n\nuptime-kuma is a fancy self-hosted monitoring tool. It monitors the uptime of my websites and the status of my services. It uses a beautiful dashboard to display the status of your monitored sites.\n\nMy uptime-kuma configuration files can be found in the [uptime-kuma-compose][uptime-kuma-compose] directory.\n\n![uptime-kuma dashboard][uptime-kuma-dashboard]\n\n### heimdall\n\nHeimdall is a dashboard for all my web applications. It is a way to organize all the applications that I use daily.\n\nMy heimdall configuration files can be found in the [heimdall-compose][heimdall-compose] directory.\n\n![heimdall dashboard][heimdall-dashboard]\n\n### postgres\n\nPostgres is a relational database management system. I use it to store data for my applications. I use it for my [nextcloud][nextcloud-compose].\n\nMy postgres configuration files can be found in the [postgres-compose][postgres-compose] directory.\n\n### nextcloud\n\nNextcloud is a suite of client-server software for creating and using file hosting services. It is functionally similar to Dropbox, although Nextcloud is free and open-source, allowing anyone to install and operate it on a private server.\n\nMy nextcloud configuration files can be found in the [nextcloud-compose][nextcloud-compose] directory.\n\n![nextcloud dashboard][nextcloud-dashboard]\n\n### ntp\n\nNTP is a networking protocol for clock synchronization between computer systems over packet-switched, variable-latency data networks. In operation since before 1985, NTP is one of the oldest Internet protocols in current use. I use it to synchronize the time on my local network.\n\nMy ntp configuration files can be found in the [ntp-compose][ntp-compose] directory.\n\n### cloudflared\n\nCloudflared is a lightweight tunnel daemon that proxies any localhost HTTP traffic through the Cloudflare network. I use it to expose my services to the internet.\n\nMy cloudflared configuration files can be found in the [cloudflared-compose][cloudflared-compose] directory.\n\n### pihole\n\nPi-hole is a Linux network-level advertisement and Internet tracker blocking application that acts as a DNS sinkhole and optionally a DHCP server, intended for use on a private network. I use it to block ads on my local network. I have running alongside unbound to provide DNS. Unbound is a validating, recursive, and caching DNS resolver. I use it to provide DNS resolution for my services.\n\nMy pihole configuration files can be found in the [pihole-compose][pihole-compose] directory.\n\n![pihole dashboard][pihole-dashboard]\n\n### swagger-editor\n\nSwagger Editor lets you edit OpenAPI specifications in YAML inside your browser and preview documentation in real-time. I use it to edit my OpenAPI specifications. Since I am a backend developer, I use it to document my APIs.\n\nMy swagger-editor configuration files can be found in the [swagger-editor][swagger-editor] directory.\n\n### immich\n\nImmich is a photo album that I use to store all my photos. I use it to store all my photos. Immich is divided into several services, which are run as individual docker containers.\n\n1. `immich-server` - Handle and respond to REST API requests\n2. `immich-microservices` - Execute background jobs (thumbnail generation, metadata extraction, transcoding, etc.)\n3. `immich-machine-learning` - Execute machine-learning models\n4. `postgres` - Persistent data storage\n5. `redis`- Queue management for immich-microservices\n\nMy immich configuration files can be found in the [immich-compose][immich-compose] directory.\n\n![immich dashboard][immich-dashboard]\n\n### redis\n\nRedis is an in-memory data structure store, used as a distributed, in-memory key–value database, cache and message broker, with optional durability. I use it to store data for my applications. I use it for my [immich][immich-compose] application.\n\nMy redis configuration files can be found in the [redis-compose][redis-compose] directory.\n\n### vaultwarden\n\nVaultwarden is a lightweight implementation of the Bitwarden API, written in Rust, supports password management and generation, and can be self-hosted. I use it to store my passwords.\n\nMy vaultwarden configuration files can be found in the [vaultwarden-compose][vaultwarden-compose] directory.\n\n### opengist\n\nOpenGist is a lightweight implementation of the GitHub Gist API, written in Rust, supports creating, editing, deleting, and listing gists, and can be self-hosted. I use it to store my code snippets.\n\nMy opengist configuration files can be found in the [opengist-compose][opengist-compose] directory.\n\n### speedtest-tracker\n\nSpeedtest Tracker is a self-hosted internet performance tracking application that runs speedtest checks against Ookla's Speedtest service. I use it to track my internet speeds.\n\nMy speedtest-tracker configuration files can be found in the [speedtest-tracker-compose][speedtest-tracker-compose] directory.\n\n![speedtest-tracker dashboard][speedtest-tracker-dashboard]\n\n### kavita\n\nKavita is a fast, feature rich, cross platform reading server. Built with a focus for manga and the goal of being a full solution for all your reading needs. Setup your own server and share your reading collection with your friends and family.\n\nMy kavita configuration files can be found in the [kavita-compose][kavita-compose] directory.\n\n## endlessh\n\nendlessh is an SSH tarpit that slowly sends an endless banner. It keeps SSH clients locked up for hours or even days at a time. The purpose is to put your real SSH server on another port and then let the script kiddies get stuck in this tarpit instead of bothering a real server.\n\nMy endlessh configuration files can be found in the [endlessh-compose][endlessh-compose] directory.\n\n## dozzle\n\ndozzle is a simple container log viewer for Docker. It is designed to be very minimalistic and fit into the Docker ecosystem without extra dependencies.\n\nMy dozzle configuration files can be found in the [dozzle-compose][dozzle-compose] directory.\n\n![dozzle dashboard][dozzle-dashboard]\n\n[website]: https://rodneyosodo.com\n[twitter]: https://twitter.com/b1ackd0t\n[cft]: https://www.cloudflare.com/products/tunnel/\n[odin-image]: ./assets/odin.jpg\n[computers]: ./assets/computers.jpg\n[Immich-photo-album]: https://immich.rodneyosodo.com/share/dgJE3wNLnS0ntsFlABuRwvkzCGHZeMBueTNo2NmtVKT-3mM1SYaK--p-ENXRGxph0oY\n[linux-unplugged]: https://linuxunplugged.com/\n[proxmox-dashboard]: ./assets/proxmox.png\n[services]: ./assets/homelab-arch.png\n[portainer-compose]: ./docker-compose/portainer/\n[portainer-dashboard]: ./assets/portainer.png\n[uptime-kuma-compose]: ./docker-compose/uptime-kuma/\n[uptime-kuma-dashboard]: ./assets/uptime-kuma.png\n[heimdall-compose]: ./docker-compose/heimdall/\n[heimdall-dashboard]: ./assets/heimdall.png\n[postgres-compose]: ./docker-compose/postgres/\n[nextcloud-compose]: ./docker-compose/nextcloud/\n[nextcloud-dashboard]: ./assets/nextcloud.png\n[ntp-compose]: ./docker-compose/ntp/\n[cloudflared-compose]: ./docker-compose/cloudflared/\n[pihole-compose]: ./docker-compose/pihole/\n[pihole-dashboard]: ./assets/pihole.png\n[swagger-editor]: ./docker-compose/swagger-editor/\n[immich-compose]: ./docker-compose/immich/\n[immich-dashboard]: ./assets/immich.png\n[redis-compose]: ./docker-compose/redis/\n[vaultwarden-compose]: ./docker-compose/vaultwarden/\n[opengist-compose]: ./docker-compose/opengist/\n[speedtest-tracker-compose]: ./docker-compose/speedtest-tracker/\n[speedtest-tracker-dashboard]: ./assets/speedtest.png\n[kavita-compose]: ./docker-compose/kavita/\n[endlessh-compose]: ./docker-compose/endlessh/\n[dozzle-compose]: ./docker-compose/dozzle/\n[dozzle-dashboard]: ./assets/dozzle.png\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frodneyosodo%2Fhomelab","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frodneyosodo%2Fhomelab","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frodneyosodo%2Fhomelab/lists"}