2021-04-19 21:41:25 +07:00
|
|
|
# Homelab
|
2020-06-22 14:51:36 +07:00
|
|
|
|
2021-02-15 11:49:23 +07:00
|
|
|
```diff
|
2021-02-15 11:53:55 +07:00
|
|
|
! WORK IN PROGRESS
|
2021-02-15 11:49:23 +07:00
|
|
|
```
|
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-02-12 16:38:12 +07:00
|
|
|
- 4 nodes of NEC SFF PC (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-02-12 16:33:45 +07:00
|
|
|
## Architecture
|
2020-07-23 16:45:58 +07:00
|
|
|
|
2021-02-15 11:40:35 +07:00
|
|
|
| Layer | Name | Description | Provisioner |
|
|
|
|
|-------|------------------------|--------------------------------------------------------------|---------------------|
|
|
|
|
| 0 | [metal](./metal) | Bare metal OS installation, LXD, Terraform state backend,... | Ansible, PXE server |
|
2021-02-15 12:10:02 +07:00
|
|
|
| 1 | [infra](./infra) | Kubernetes clusters, shared apps (Git, Vault, Argo...) | Terraform, Helm |
|
2021-02-15 12:10:48 +07:00
|
|
|
| 2 | [apps](./apps) | | Argo |
|
2021-02-15 11:40:35 +07:00
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
|
|
### Prerequisite
|
|
|
|
|
|
|
|
For the controller (to run Ansible, stateless PXE server, Terraform...):
|
|
|
|
|
|
|
|
- SSH keys in `~/.ssh/{id_rsa,id_rsa.pub}`
|
|
|
|
- Docker with `host` networking driver (which means [only Docker on Linux hosts](https://docs.docker.com/network/host/))
|
|
|
|
|
|
|
|
For bare metal nodes:
|
|
|
|
|
|
|
|
- PXE IPv4 enabled
|
|
|
|
- Wake-on-LAN enabled
|
|
|
|
- Secure boot disabled (optional, depending on the OS)
|
|
|
|
|
|
|
|
### Configurations
|
|
|
|
|
|
|
|
- [Bare metal nodes settings](./metal/hosts.ini) (IP, MAC...)
|
|
|
|
- [OS settings](./metal/group_vars/all.yml) (PXE, network...)
|
|
|
|
|
|
|
|
### Building
|
|
|
|
|
2021-03-27 03:45:56 +07:00
|
|
|
Open the tools container:
|
2021-02-15 11:40:35 +07:00
|
|
|
|
|
|
|
```sh
|
|
|
|
make
|
|
|
|
```
|
|
|
|
|
2021-03-27 03:45:56 +07:00
|
|
|
Then build each layer:
|
2021-02-15 11:40:35 +07:00
|
|
|
|
|
|
|
```sh
|
2021-03-27 03:45:56 +07:00
|
|
|
make metal
|
2021-02-15 11:40:35 +07:00
|
|
|
make infra
|
2021-03-27 03:45:56 +07:00
|
|
|
make apps
|
2021-02-15 11:40:35 +07:00
|
|
|
```
|
2021-02-23 21:38:41 +07:00
|
|
|
|
2021-04-20 01:40:33 +07:00
|
|
|
## Release notes
|
2021-04-19 21:41:25 +07:00
|
|
|
|
|
|
|
<details>
|
|
|
|
|
|
|
|
None
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
2021-04-20 01:40:33 +07:00
|
|
|
## Roadmap
|
2021-04-19 21:41:25 +07:00
|
|
|
|
2021-04-20 01:40:33 +07:00
|
|
|
<details open>
|
2021-04-19 21:41:25 +07:00
|
|
|
|
2021-04-20 01:40:33 +07:00
|
|
|
- [ ] `0.0.1-alpha`:
|
2021-04-19 21:41:25 +07:00
|
|
|
- [x] Bare metal provisioning with PXE
|
|
|
|
- [x] LXD cluster
|
|
|
|
- [x] Terraform state backend (etcd)
|
|
|
|
- [x] RKE cluster
|
2021-04-20 01:40:33 +07:00
|
|
|
- [ ] Core services (Vault, Gitea, DroneCI, ArgoCD,...)
|
2021-04-19 21:41:25 +07:00
|
|
|
- [x] Public services to the internet (via port forwarding or Cloudflare Tunnel)
|
2021-04-20 01:40:33 +07:00
|
|
|
- [ ] `0.0.2-alpha`:
|
|
|
|
- [ ] VPN (Wireguard)
|
|
|
|
- [ ] Access the lab from the internet via VPN
|
|
|
|
- [ ] Container registry (just pull through cache for faster cluster build time)
|
|
|
|
- [ ] `0.1.0-beta`:
|
2021-04-19 21:41:25 +07:00
|
|
|
- [ ] Easy initial controller setup (with only Docker or Vagrant)
|
|
|
|
- [ ] Fast metal image preparation
|
|
|
|
- [ ] Mount metal image without `sudo` (7zip?)
|
|
|
|
- [ ] Automated metal secrets generation and management
|
|
|
|
- [ ] Automated `./infra` authentication from `./metal` (Terraform backend and provider)
|
|
|
|
- [ ] Metal node automatic patching
|
|
|
|
- [ ] Seperate network
|
|
|
|
- [ ] Local DNS (PiHole?)
|
|
|
|
- [ ] Jump box (or HashiCorp Boundary?)
|
|
|
|
- [ ] Habor (private container registry for new applications)
|
|
|
|
- [ ] Self managed infrastucture
|
|
|
|
- [ ] Mirror all git repositories from GitHub automatically (with git hook for faster sync?)
|
|
|
|
- [ ] Monitoring and alerting
|
|
|
|
- [ ] Addition services (NextCloud, PeerTube, mailcow, Mattermost/Rocket Chat,...)
|
|
|
|
- [ ] Dashboard for services
|
|
|
|
- [ ] SSO
|
|
|
|
- [ ] Backup solution (3 copies, 2 seperate devices, 1 offsite)
|
|
|
|
- [ ] Automatic release
|
2021-04-20 01:40:33 +07:00
|
|
|
- [ ] `1.0.0`:
|
2021-04-19 21:41:25 +07:00
|
|
|
- [ ] 100% automated (including backups and secrets management, double check with a full rebuild)
|
|
|
|
- [ ] Cross platform inital controller support (Linux, macOS, Windows)
|
|
|
|
- [ ] HA for everything
|
|
|
|
- [ ] Backup encrytion
|
|
|
|
- [ ] Secure by default
|
|
|
|
- [ ] DRY (or rule of three)
|
|
|
|
- [ ] Complete documentation and architecture diagram (automated update if possible)
|
|
|
|
- [ ] Walkthrough building tutorial and feature demo
|
2021-04-20 01:40:33 +07:00
|
|
|
- [ ] `1.0.1`:
|
|
|
|
- [ ] Bug fixes (TBD)
|
|
|
|
- [ ] `1.1.0`:
|
|
|
|
- [ ] Addition services (TBD)
|
2021-04-19 21:41:25 +07:00
|
|
|
- [ ] Backlog:
|
|
|
|
- [ ] Automated testing
|
|
|
|
- [ ] Security review/audit
|
|
|
|
- [ ] Migrate to RKE2 (new Terraform provider for RKE2 is not release yet)
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
2021-04-20 01:40:33 +07:00
|
|
|
You can also checkout the [TODO list](./docs/todo.md).
|
|
|
|
|
2021-03-11 01:14:40 +07:00
|
|
|
## Acknowledgments
|
2021-02-23 21:38:41 +07:00
|
|
|
|
|
|
|
- [Fix `nf_conntrack` hash size fix for Kubernetes on LXD](https://github.com/corneliusweig/kubernetes-lxd/issues/10#issuecomment-615950053)
|
|
|
|
- [Humble project](https://github.com/locmai/humble)
|
|
|
|
- [Kubernetes on LXD issue with BTRFS](https://medium.com/@ernstae/kubenetes-on-lxd-with-rancher-2-0-part-one-and-a-half-94e6e03f4f2e)
|
|
|
|
- [LXD container profile for Kubernetes](https://github.com/justmeandopensource/kubernetes/blob/master/lxd-provisioning/k8s-profile-config)
|
2021-04-18 23:57:14 +07:00
|
|
|
- [Make LXD containers get IP addresses from LAN](https://blog.simos.info/how-to-make-your-lxd-container-get-ip-addresses-from-your-lan/)
|
2021-02-23 21:38:41 +07:00
|
|
|
- [Minio Ansible role](https://github.com/atosatto/ansible-minio)
|
|
|
|
- [Some device mount for Kubernetes on LXD](https://github.com/atosatto/ansible-minio)
|