# NixOS GitOps Bootstrap Guide This repository is designed to be fully automated once bootstrapped, but if you are adapting this codebase for **your own infrastructure**, you must modify several deployment-specific variables before running the bootstrap script on a fresh Proxmox host. ## Adapt the Codebase Before bootstrapping your host, fork or clone this repository and make the following changes to match your environment: ### Hardware Identifiers - **Find your NVMe/Disk UUID**: Log into your fresh Proxmox host and run: ```bash ls -l /dev/disk/by-id/ ``` Identify your primary data disk (e.g. `nvme-eui...` or `wwn-0x...`). - **Update OpenTofu Config**: Open `opentofu/nodes/mikoshi/main.tf` (you may want to rename `mikoshi` to your host's name) and replace the `disk` ID inside the `zpool` resource with your hardware UUID. ### Identity & Access - **SSH Keys**: The GitOps Control Center needs an SSH key for disaster recovery. - Update the Cloud-Init SSH key in `opentofu/nodes/mikoshi/main.tf` under the `user_account` block. - Update the permanent NixOS SSH key in `nixos/users/admin/default.nix`. - **Secrets (SOPS)**: Replace the placeholder tokens in the Control Center host config (e.g., `nixos/hosts/izanagi/secrets.yaml` if you haven't renamed it) with your actual Proxmox API token and Forgejo token. Encrypt this file with your own `sops` Age key. ### Hostname & Naming Schema If your Proxmox host or your Control Center has a different name: - Rename the folders in `opentofu/nodes/` and `nixos/hosts/`. - Update the `node_name` inside your OpenTofu `main.tf`. - Update `nixos/flake.nix` to reflect your new host names. ### The Golden Image Because the GitOps Control Center must be spun up fully configured without human intervention, you need a pre-built NixOS `.qcow2` image. 1. Build the golden image locally (requires Nix/WSL): ```bash nix run github:nix-community/nixos-generators -- --flake ./nixos#izanagi --format qcow ``` 2. Upload the resulting `.qcow2` file to your Proxmox node. 3. Create a new VM in Proxmox with **ID 9000**. 4. Import the `.qcow2` as its disk and convert the VM into a **Template**. *(Ensure the template has Cloud-Init configured).* ## Execute the Bootstrap Once you have pushed your adapted codebase to your Git server, SSH into your fresh Proxmox node as `root` and run the bootstrap script: ```bash curl -fsSL https://git.your-server.com/your-repo/raw/branch/main/scripts/bootstrap.sh | bash ``` ### What this script does automatically: - **Fixes APT Repositories**: Disables enterprise repositories and adds community repositories. - **Fixes NIC Offloading**: Installs a systemd service to safely disable TSO/GSO/GRO on physical interfaces to prevent network drops. - **Installs OpenTofu**: Pulls the official binaries. - **Applies Host State**: Runs `tofu apply` which: - Formats your specified disk into the `data` ZFS pool. - Sets laptop lid switch to ignore (if applicable). - Spins up the GitOps Control Center VM. ## Post-Bootstrap Once the bootstrap script completes, the Control Center VM will boot, initialize via Cloud-Init, and automatically start pulling this git repository. From this point on, **you no longer need to log into the Proxmox host.** All future changes to VMs, networks, or applications should be done declaratively via Pull Requests to your repository!