2021-04-19 21:41:25 +07:00
# Homelab
2020-06-22 14:51:36 +07:00
2021-05-02 22:26:54 +07:00
> ⚠️ WORK IN PROGRESS
2021-02-12 16:33:45 +07:00
2021-02-12 16:38:12 +07:00
## Hardware
2020-11-13 00:16:14 +07:00
![Hardware ](https://user-images.githubusercontent.com/27996771/98970963-25137200-2543-11eb-8f2d-f9a2d45756ef.JPG )
2021-06-06 13:57:38 +07:00
- 4 nodes of NEC SFF PC `PC-MK26ECZDR` (Japanese version of the ThinkCentre M700)
2020-11-13 00:16:14 +07:00
- CPU: Intel Core i5-6600T
- RAM: 16GB
- SSD: 128GB
2021-02-12 16:38:12 +07:00
- TP-Link TL-SG108 switch
2020-11-13 00:16:14 +07:00
2021-05-16 15:58:41 +07:00
## Technology stack
< table >
< tr >
< td align = "center" > < a > < img src = "https://simpleicons.org/icons/ansible.svg" width = "100px;" / > < br / > Ansible< / td >
< td align = "center" > < a > < img src = "https://simpleicons.org/icons/cloudflare.svg" width = "100px;" / > < br / > Cloudflare< / td >
< td align = "center" > < a > < img src = "https://simpleicons.org/icons/docker.svg" width = "100px;" / > < br / > Docker< / td >
2021-05-16 22:12:15 +07:00
< td align = "center" > < a > < img src = "https://simpleicons.org/icons/fedora.svg" width = "100px;" / > < br / > Fedora< / td >
2021-05-16 15:58:41 +07:00
< td align = "center" > < a > < img src = "https://simpleicons.org/icons/gitea.svg" width = "100px;" / > < br / > Gitea< / td >
< td align = "center" > < a > < img src = "https://simpleicons.org/icons/helm.svg" width = "100px;" / > < br / > Helm< / td >
< / tr >
< tr >
< td align = "center" > < a > < img src = "https://simpleicons.org/icons/kubernetes.svg" width = "100px;" / > < br / > Kubernetes< / td >
< td align = "center" > < a > < img src = "https://simpleicons.org/icons/prometheus.svg" width = "100px;" / > < br / > Prometheus< / td >
< td align = "center" > < a > < img src = "https://simpleicons.org/icons/rancher.svg" width = "100px;" / > < br / > Rancher< / td >
< td align = "center" > < a > < img src = "https://simpleicons.org/icons/terraform.svg" width = "100px;" / > < br / > Terraform< / td >
< td align = "center" > < a > < img src = "https://simpleicons.org/icons/vault.svg" width = "100px;" / > < br / > Vault< / td >
< td align = "center" > < a > < img src = "https://simpleicons.org/icons/wireguard.svg" width = "100px;" / > < br / > Wireguard< / td >
< / tr >
2021-05-21 01:26:03 +07:00
< tr >
< / tr >
2021-05-16 15:58:41 +07:00
< / table >
2021-02-12 16:33:45 +07:00
## Architecture
2020-07-23 16:45:58 +07:00
2021-06-05 03:38:28 +07:00
### Quick explanation
2021-06-05 03:21:44 +07:00
- Enter the tools container, which contains all the neccessary tools (see building instruction bellow)
- Run `make`
2021-06-05 03:38:28 +07:00
- Ansible will render the [configuration file for each bare metal machine (like IP, hostname...) and the PXE server from templates ](./metal/roles/pxe-boot/templates )
2021-06-05 03:21:44 +07:00
- The tools container will create sibling containers to build a PXE server (includes DHCP, TFTP and HTTP server)
2021-06-05 03:38:28 +07:00
- Ansible will [wake the machines up ](./metal/roles/pxe-boot/tasks/wake.yml ) using Wake on LAN
2021-06-05 03:21:44 +07:00
- The machine start the boot process:
- BIOS boot in network mode and look for DHCP server
- DHCP server point it to the TFTP server to get boot files and boot config
2021-06-05 04:02:54 +07:00
- The boot config contains parameter to get [automated OS installation config file ](./metal/roles/pxe-boot/templates/http/kickstart/fedora.ks.j2 )
2021-06-05 03:21:44 +07:00
- The OS get installed and the machine reboots to the new operating system
2021-06-05 03:38:28 +07:00
- Terraform will create a Kubernetes [cluster ](./infra/main.tf )
- ArgoCD will install the [applications ](./apps/resources )
### Layers
2021-06-05 03:21:44 +07:00
2021-05-21 01:26:03 +07:00
| Layer | Name | Description | Provisioner |
|-------|------------------------|---------------------------------------------------------|---------------------|
| 0 | [metal ](./metal ) | Bare metal OS installation, Terraform state backend,... | Ansible, PXE server |
2021-06-05 02:45:14 +07:00
| 1 | [infra ](./infra ) | Kubernetes clusters | Terraform, Helm |
| 2 | [apps ](./apps ) | Gitea, Vault and more in the future | Argo |
2021-02-15 11:40:35 +07:00
2021-06-08 19:47:43 +07:00
## Get Started
2021-02-15 11:40:35 +07:00
### Prerequisite
For the controller (to run Ansible, stateless PXE server, Terraform...):
2021-05-21 01:26:03 +07:00
- SSH keys in `~/.ssh/{id_ed25519,id_ed25519.pub}` (you can generate it with `ssh-keygen -t ed25519` )
2021-05-16 12:59:40 +07:00
- Docker with `host` networking driver (which means [only Docker on Linux hosts ](https://docs.docker.com/network/host/ ), you can use a Linux virtual machine with bridged networking if you're on macOS or Windows)
2021-02-15 11:40:35 +07:00
For bare metal nodes:
- PXE IPv4 enabled
2021-06-08 19:47:43 +07:00
- Wake-on-LAN enabled and boot to network mode by default if turned on via Wake-on-LAN
2021-02-15 11:40:35 +07:00
- Secure boot disabled (optional, depending on the OS)
2021-06-08 19:47:43 +07:00
- Note their MAC addresses
2021-02-15 11:40:35 +07:00
### Configurations
2021-06-08 19:47:43 +07:00
Change these configuration files to match your hardware and network setup:
2021-06-08 21:17:42 +07:00
- [Bare metal nodes settings ](./metal/hosts.yml ) (IP, MAC...)
2021-02-15 11:40:35 +07:00
- [OS settings ](./metal/group_vars/all.yml ) (PXE, network...)
2021-06-08 19:47:43 +07:00
### Build
2021-02-15 11:40:35 +07:00
2021-03-27 03:45:56 +07:00
Open the tools container:
2021-02-15 11:40:35 +07:00
```sh
2021-05-16 13:20:27 +07:00
make tools
2021-02-15 11:40:35 +07:00
```
2021-05-16 13:20:27 +07:00
Then build the homelab:
2021-02-15 11:40:35 +07:00
```sh
2021-05-16 13:20:27 +07:00
make
2021-02-15 11:40:35 +07:00
```
2021-06-08 19:47:43 +07:00
## Roadmap
See [roadmap ](./docs/roadmap.md ) and [open issues ](https://github.com/khuedoan/homelab/issues ) for a list of proposed features and known issues.
## Contributing
Any contributions you make are greatly appreciated (feature, bug fixes, documentation, grammar or typo fix...).
## License
Distributed under the GPLv3 License. See `LICENSE` for more information.
## Acknowledgements
- ArgoCD usage in [my coworker's homelab ](https://github.com/locmai/humble )
- [README template ](https://github.com/othneildrew/Best-README-Template )