4.9 KiB
Home Assistant Example
This configuration.nix file sets up a LDAP server and Home Assistant server.
This guide will show how to deploy this configuration.nix to a Virtual Machine, like showed
here, in 5 commands.
Launch VM
Build VM with:
nixos-rebuild build-vm-with-bootloader --fast -I nixos-config=./configuration.nix -I nixpkgs=.
Start VM with:
QEMU_NET_OPTS="hostfwd=tcp::2222-:2222,hostfwd=tcp::8080-:80" ./result/bin/run-nixos-vm
User and password are both nixos, as setup in the configuration.nix file under
user.users.nixos.initialPassword.
You can login with ssh -F ssh_config example. You just need to accept the fingerprint.
Make VM able to decrypt the secrets.yaml file
Note: I'm working on making these steps unnecessary but these still need to be done every time you create the VM.
The sops.yaml file describes what private keys can decrypt and encrypt the
secrets.yaml file containing the application secrets. You will add secrets to
the file and when deploying, that file will be decrypted and the secrets will be copied in the
/run/secrets folder on the VM. We thus need one private key for you to edit the
secrets.yaml file and one in the VM for it to decrypt the secrets.
Your private is already pre-generated in this repo, it's the sshkey file. But when
creating the VM in the step above, a new private key and its accompanying public key was
automatically generated under /etc/ssh/ssh_host_ed25519_key in the VM. We will need to get the
public key and replace the one in the sops.yaml vm field.
With the VM started, print the VM's public age key with the following command. The value you need to
copy in the sops.yaml file is the one staring with age.
$ nix shell nixpkgs#ssh-to-age --command sh -c 'ssh-keyscan -p 2222 -4 localhost | ssh-to-age'
# localshost:2222 SSH-2.0-OpenSSH_9.1
# localhost:2222 SSH-2.0-OpenSSH_9.1
# localhost:2222 SSH-2.0-OpenSSH_9.1
# localhost:2222 SSH-2.0-OpenSSH_9.1
# localhost:2222 SSH-2.0-OpenSSH_9.1
skipped key: got ssh-rsa key type, but only ed25519 keys are supported
age1l9dyy02qhlfcn5u9s4y2vhsvjtxj2c9avrpat6nvjd6rjar3tflq66jtz0
SOPS_AGE_KEY_FILE=keys.txt nix run --impure nixpkgs#sops -- --config sops.yaml -r -i --add-age age1l9dyy02qhlfcn5u9s4y2vhsvjtxj2c9avrpat6nvjd6rjar3tflq66jtz0 secrets.yaml
It is not required for the example here as the secrets file is already pre-filled with the correct data, but if you want to update the secrets.yaml file interactively or take a look, you can use:
SOPS_AGE_KEY_FILE=keys.txt nix run --impure nixpkgs#sops -- --config sops.yaml secrets.yaml
Deploy
Now, deploy with:
SSH_CONFIG_FILE=ssh_config nix run nixpkgs#colmena --impure -- apply
Took a few minutes for first deploy on my machine. Next deploys take about 12 seconds.
Access apps through your browser
Add the following entry to your /etc/hosts file:
networking.hosts = {
"127.0.0.1" = [ "ha.example.com" "ldap.example.com" ];
};
Which produces:
$ cat /etc/hosts
127.0.0.1 ha.example.com ldap.example.com
- username:
admin - password: the value of the field
lldap.user_passwordin thesecrets.yamlfile.
Create the group homeassistant_user and a user assigned to that group.
Go to and login with the user and password you just created above.
Prepare the VM
This section documents how the various files were created to provide the nearly out of the box experience described in the previous section. I need to clean this up a bit.
Private and Public Key
Create the private key in the keys.txt file and print the public key used for admin:
$ nix shell nixpkgs#age --command age-keygen -o keys.txt
Public key: age1algdv9xwjre3tm7969eyremfw2ftx4h8qehmmjzksrv7f2qve9dqg8pug7
Update admin and vm keys in sops.yaml.
Then, you can create the secrets.yaml with:
That file must follow the format:
home-assistant: |
name: "My Instance"
country: "US"
latitude_home: "0.100"
longitude_home: "-0.100"
time_zone: "America/Los_Angeles"
unit_system: "metric"
lldap:
user_password: XXX...
jwt_secret: YYY...
You can generate secrets with:
$ nix run nixpkgs#openssl -- rand -hex 64
TODO: add instructions to create ssh private and public key:
You don't need to copy over the ssh public key with the following command as we set the keyFiles option. I still leave it here for reference.
$ nix shell nixpkgs#openssh --command ssh-copy-id -i sshkey -F ssh_config example
Deploy
If you get a NAR hash mismatch error like so, you need to run nix flake update:
error: NAR hash mismatch in input ...