1
0
Fork 0
selfhostblocks/examples/homeassistant/README.md

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

Go to and login with:

  • username: admin
  • password: the value of the field lldap.user_password in the secrets.yaml file.

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 ...