Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| infrastructure:nixos-boxes [2025/12/21 08:21] – diamond | infrastructure:nixos-boxes [2026/01/08 09:12] (current) – move bitwarden-sops out into a page diamond | ||
|---|---|---|---|
| Line 4: | Line 4: | ||
| As the name describes, these boxes run NixOS, but they' | As the name describes, these boxes run NixOS, but they' | ||
| + | |||
| + | ## Pages | ||
| + | |||
| + | ```dokuwiki | ||
| + | <catlist infrastructure: | ||
| + | ``` | ||
| ## Structure | ## Structure | ||
| Line 54: | Line 60: | ||
| > local gitignore by running: | > local gitignore by running: | ||
| > | > | ||
| - | > ```sh | + | > `echo " |
| - | > echo " | + | |
| - | > ``` | + | ## Deployment |
| + | |||
| + | All NixOS boxes are automatically deployed with GitOps practices. The following diagram briefly explains its architecture: | ||
| + | |||
| + | ```dokuwiki | ||
| + | <div centeralign> | ||
| + | < | ||
| + | flowchart TD | ||
| + | codeberg[dma/ | ||
| + | codeberg --[pull every 15s]--> comin_a | ||
| + | codeberg --[pull every 15s]--> comin_b | ||
| + | subgraph nixos_machine_a[NixOS Machine A] | ||
| + | nixos_rebuild_a[nixos-rebuild] | ||
| + | comin_a[comin.service] --> nixos_rebuild_a | ||
| + | end | ||
| + | subgraph nixos_machine_b[NixOS Machine B] | ||
| + | nixos_rebuild_b[nixos-rebuild] | ||
| + | comin_b[comin.service] --> nixos_rebuild_b | ||
| + | end | ||
| + | </ | ||
| + | </ | ||
| + | ``` | ||
| + | |||
| + | Whenever a new commit is pushed to the `main` branch, all machines race to deploy this new commit. This way, we achieve GitOps without requiring an actual CI/CD pipeline, simplifying the deployment pipeline by a lot. | ||
| + | |||
| + | To see how caught up the deployments are on the NixOS fleet, run `just watch`. This spawns a dashboard of machines and their commits which refreshes every 5 seconds. Use this immediately after pushing to comprehensively view how the machines are going along. | ||
| + | |||
| + | ### Testing Branches | ||
| + | |||
| + | [comin](https:// | ||
| + | |||
| + | To use this, simply push a new commit to a new `testing-{machine}` branch, where `{machine}` is the name of the machine. For example, a commit that updates `home-assistant-one`' | ||
| + | |||
| + | Once everything is tested to be working, you can simply `git checkout main` then `git rebase testing-{machine}` to add your new commits on top. Then, push to main as usual. | ||
| ## Common Operations | ## Common Operations | ||
| Line 66: | Line 106: | ||
| just | just | ||
| ``` | ``` | ||
| - | |||
| - | A few notable recipes include: | ||
| - | |||
| - | - `just deploy < | ||
| - | have the hostname of `< | ||
| - | - `just ssh < | ||
| - | the above rule. | ||
| - | - `just sync-bitwarden-secrets < | ||
| - | machine. See | ||
| - | [Adding Bitwarden Secrets to a Machine](# | ||
| ## Playbooks | ## Playbooks | ||
| Line 112: | Line 142: | ||
| #### Installing NixOS Quickly | #### Installing NixOS Quickly | ||
| - | Install NixOS directly by flashing it onto the hard drive using a SATA-to-USB | + | Install NixOS directly by flashing it onto the hard drive using a SATA-to-USB or NVME-to-USB adapter. This will save you the trouble of having to transfer this repository over to the machine' |
| - | or NVME-to-USB adapter. This will save you the trouble of having to transfer | + | |
| - | this repository over to the machine' | + | If you're inside the Nix develop environment, |
| - | will be very handy: | + | |
| + | ```sh | ||
| + | sudo disko-install \ | ||
| + | --mode format \ | ||
| + | --disk '< | ||
| + | --flake " | ||
| + | ``` | ||
| + | |||
| + | > **Note:** Use `path:// | ||
| + | |||
| + | > **Note:** This doesn' | ||
| + | |||
| + | If you're doing this from the NixOS live environment, | ||
| ```sh | ```sh | ||
| Line 138: | Line 180: | ||
| ### Adding Bitwarden Secrets to a Machine | ### Adding Bitwarden Secrets to a Machine | ||
| - | If you're here, chances are you're already added into the administration group | + | Moved to [a separate playbook](/infrastructure/playbook/ |
| - | for Bitwarden users. If not, please reach out to an existing administrator first | + | |
| - | to be added before continuing. | + | |
| - | + | ||
| - | Before continuing, **it is strongly advised that you have [Nix][nix] and | + | |
| - | [Direnv][direnv] installed**. This will allow you to store your Bitwarden | + | |
| - | secrets much easier. | + | |
| - | + | ||
| - | #### Preparing the Bitwarden CLI | + | |
| - | + | ||
| - | First, set the `BITWARDENCLI_APPDATA_DIR` environment variable to prevent the | + | |
| - | CLI from using or overriding your personal Bitwarden configuration. It is | + | |
| - | strongly recommended to set this in `.envrc` so you don't forget: | + | |
| - | + | ||
| - | ```sh | + | |
| - | $ cat .envrc | + | |
| - | export BITWARDENCLI_APPDATA_DIR=" | + | |
| - | ... | + | |
| - | ``` | + | |
| - | + | ||
| - | Then, you'll need to obtain your Bitwarden API key. For this, follow the | + | |
| - | [Bitwarden official documentation](https:// | + | |
| - | You may choose to add these as environment variables as well: | + | |
| - | + | ||
| - | ```sh | + | |
| - | $ cat .envrc | + | |
| - | export BW_CLIENTID=" | + | |
| - | export BW_CLIENTSECRET=" | + | |
| - | ``` | + | |
| - | + | ||
| - | Now, proceed to run `bw unlock`. This will prompt you for your master password | + | |
| - | and return | + | |
| - | add this key as well: | + | |
| - | + | ||
| - | ```sh | + | |
| - | $ cat .envrc | + | |
| - | export BW_SESSION=" | + | |
| - | ``` | + | |
| - | + | ||
| - | Doing this is not recommended however, since it exposes your session key (and | + | |
| - | therefore essentially your entire vault) in plaintext on disk, and the key will | + | |
| - | never expire. Instead, prefer exporting it manually in the current shell | + | |
| - | session. | + | |
| - | + | ||
| - | #### Adding a Secret | + | |
| - | + | ||
| - | Head to the Bitwarden web app or extension, then navigate to the **Server | + | |
| - | Credentials/ | + | |
| - | machine. | + | |
| - | + | ||
| - | To add a secret to a machine, open the corresponding item, then add a new hidden | + | |
| - | field with the name being the SOPS path you want to store the secret at relative | + | |
| - | to `/ | + | |
| - | + | ||
| - | For example, do add a secret at `/ | + | |
| - | add a new hidden field with the name `authentik/ | + | |
| - | the value of the secret. | + | |
| - | + | ||
| - | #### Onboard the Machine to SOPS | + | |
| - | + | ||
| - | This step only needs to be done once per machine. To validate that a machine is | + | |
| - | ready for SOPS, ensure it has the `sops.*` options in its `configuration.nix`. | + | |
| - | + | ||
| - | If not, start by referring to | + | |
| - | [sops-nix' | + | |
| - | Essentially, | + | |
| - | + | ||
| - | 1. Grab the machine' | + | |
| - | 2. Add it to `vars.nix` under `< | + | |
| - | 3. Find the Bitwarden secret ID. There are 2 ways to do this: | + | |
| - | - Using `just get-bitwarden-secret-id < | + | |
| - | with the exact name given, but this is not guaranteed to be in the correct | + | |
| - | | + | |
| - | - Using the `& | + | |
| - | | + | |
| - | 4. Add it to `vars.nix` under `< | + | |
| - | + | ||
| - | Then, add the boilerplate snippet to the machine' | + | |
| - | + | ||
| - | ```nix | + | |
| - | { | + | |
| - | sops = { | + | |
| - | defaultSopsFile = ./ | + | |
| - | age.sshKeyPaths = [ "/ | + | |
| - | }; | + | |
| - | } | + | |
| - | ``` | + | |
| - | + | ||
| - | #### Synchronizing Secrets | + | |
| - | + | ||
| - | First, make sure that the local Bitwarden vault is up to date by running | + | |
| - | `bw sync`. | + | |
| - | + | ||
| - | Then, run `just sync-bitwarden-secrets < | + | |
| - | from Bitwarden to the `./ | + | |
| - | SOPS file will automatically be generated with the host SSH key being the only | + | |
| - | decrypting recipient. | + | |
| - | + | ||
| - | Having more than just the host's recipient key is not recommended. Instead, | + | |
| - | prefer regenerating the secret file from source Bitwarden if needed. This way, | + | |
| - | the secrets are always up to date with Bitwarden. | + | |
| - | + | ||
| - | #### Using the Secrets | + | |
| - | + | ||
| - | You may use the secrets in your machine like any other [sops-nix][sops-nix] | + | |
| - | secrets. For example: | + | |
| - | + | ||
| - | ```nix | + | |
| - | sops.secrets." | + | |
| - | owner = " | + | |
| - | }; | + | |
| - | ``` | + | |
| - | + | ||
| - | This will place the secret at `/ | + | |
| - | being the `authentik` user. | + | |
| - | + | ||
| - | Deploy the machine using `just deploy < | + | |
| - | the machine. | + | |
| - | + | ||
| - | [nix]: https:// | + | |
| - | [direnv]: https:// | + | |
| - | [sops-nix]: https:// | + | |