khuedoan-homelab/README.md

118 lines
4.5 KiB
Markdown
Raw Normal View History

2021-04-19 21:41:25 +07:00
# Homelab
2020-06-22 14:51:36 +07:00
2021-06-10 19:34:15 +07:00
```diff
! ⚠️ 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-10 07:14:10 +07:00
- 4 nodes of NEC SFF `PC-MK26ECZDR` (Japanese version of the ThinkCentre M700):
- CPU: `Intel Core i5-6600T @ 2.70GHz`
- RAM: `16GB`
- SSD: `128GB`
- TP-Link `TL-SG108` switch:
- Ports: `8`
- Speed: `1000Mbps`
2021-05-16 15:58:41 +07:00
2021-02-12 16:33:45 +07:00
## Architecture
2020-07-23 16:45:58 +07:00
2021-06-10 07:14:10 +07:00
A single `make` command will automatically:
- Build the `./metal` layer:
- Create an ephemeral, stateless PXE server
- Install Linux on all servers in parallel
- Build the `./infra` layer:
- Create a Kubernetes [cluster](./infra/cluster.tf) using RKE
- Install some [Helm chart for bootstrap](./infra/bootstrap.tf)
- Build the `./apps` layer:
- Kustomize creates Argo [applications](./apps/resources)
- ArgoCD install those applications
2021-06-05 03:38:28 +07:00
2021-06-10 07:14:10 +07:00
Visit the README file for each layer to learn more.
2021-06-05 03:21:44 +07:00
2021-06-10 07:14:10 +07:00
| Layer | Description | Provisioner |
|------------------------|---------------------------------------------------------|-------------------------|
| [metal](./metal) | Bare metal OS installation, Terraform state backend,... | Ansible, PXE server |
| [infra](./infra) | Kubernetes cluster | Terraform, Helm |
| [apps](./apps) | Gitea, Vault and more in the future | Kustomize, ArgoCD, Helm |
2021-02-15 11:40:35 +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`)
- 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
- 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)
- Note their MAC addresses
2021-02-15 11:40:35 +07:00
### Configurations
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...)
### Build
2021-02-15 11:40:35 +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
```
## Roadmap
2021-06-10 20:27:57 +07:00
See [to-do list](./docs/todo.md), [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.
2021-06-10 07:14:10 +07:00
## Technology stack
<table>
<tr>
<td align="center"><a><img src="https://simpleicons.org/icons/ansible.svg" width="50px;"/><br/>Ansible</td>
<td align="center"><a><img src="https://simpleicons.org/icons/cloudflare.svg" width="50px;"/><br/>Cloudflare</td>
<td align="center"><a><img src="https://simpleicons.org/icons/docker.svg" width="50px;"/><br/>Docker</td>
<td align="center"><a><img src="https://simpleicons.org/icons/fedora.svg" width="50px;"/><br/>Fedora</td>
<td align="center"><a><img src="https://simpleicons.org/icons/gitea.svg" width="50px;"/><br/>Gitea</td>
<td align="center"><a><img src="https://simpleicons.org/icons/helm.svg" width="50px;"/><br/>Helm</td>
</tr>
<tr>
<td align="center"><a><img src="https://simpleicons.org/icons/kubernetes.svg" width="50px;"/><br/>Kubernetes</td>
<td align="center"><a><img src="https://simpleicons.org/icons/prometheus.svg" width="50px;"/><br/>Prometheus</td>
<td align="center"><a><img src="https://simpleicons.org/icons/rancher.svg" width="50px;"/><br/>Rancher</td>
<td align="center"><a><img src="https://simpleicons.org/icons/terraform.svg" width="50px;"/><br/>Terraform</td>
<td align="center"><a><img src="https://simpleicons.org/icons/vault.svg" width="50px;"/><br/>Vault</td>
<td align="center"><a><img src="https://simpleicons.org/icons/wireguard.svg" width="50px;"/><br/>Wireguard</td>
</tr>
<tr>
</tr>
</table>
## Acknowledgements
- ArgoCD usage in [my coworker's homelab](https://github.com/locmai/humble)
- [README template](https://github.com/othneildrew/Best-README-Template)
2021-06-09 01:49:37 +07:00
- [Run the same Cloudflare Tunnel across many `cloudflared` processes](https://developers.cloudflare.com/cloudflare-one/tutorials/many-cfd-one-tunnel)