# README
k8s-ha-git-sync
Toll that allows to sync Kubernetes deployed Home Assistant configuration with Git.
Inspired by Home Assistant Git Pull addon.
Introduction
The tool works by periodically executing a git pull
command (default interval: 60s). It then checks the validity of the configuration by calling the Home Assistant API. If the configuration is valid, it triggers a deployment restart using the Kubernetes API.
[!WARNING] The developer of this tool takes no responsibility for any unexpected changes or deletions to your Home Assistant configuration. It is your responsibility to ensure that you have a backup of your configuration before using this tool.
Pre-setup
Home Assistant
In order to validate configuration in Home Assistant, api
integration needs to be enabled: documentation.
Then in users profile a long-lived access token for this tool needs to be generated.
Git
Before deploying this tool you must correctly setup the Home Assistant configuration directory as a Git repository with a remote repository. Currently the tool does not support initializing a git repository, or cloning one.
Official Home Assistant container image has git tool pre-installed, and can be used by getting a shell in the pod.
kubectl -n <namespace> exec --stdin --tty <pod> -- /bin/bash
cd /config
git init -b <branch>
git remote add origin <repo>
git branch --set-upstream-to=origin/<branch> <branch>
.gitignore
Since Home Assistants keeps other various service files like logs, databases, backups etc... , it is recommended to ignore everything in .gitignore
file and then only allow synced files.
Example .gitignore
:
# Ignore everything
/*
# Synced files
!.gitignore
!configuration.yaml
!configuration/
Deployment
Options
Option | Environment variable | Description | Default | Required |
---|---|---|---|---|
--interval | INTERVAL | Interval in seconds between synchronizations | 60 | Yes |
--ha-config-path | CONFIG_PATH | Path to the Home Assistant configuration directory | /homeassistant | Yes |
--ha-url | HA_URL | URL of the Home Assistant instance | http://homeassitant:8123 | Yes |
--ha-token | HA_TOKEN | Long-Lived Access Token for the Home Assistant instance | Yes | |
--git-ssh-key-path | GIT_SSH_KEY_PATH | Path to the SSH key for Git authentication | No | |
--git-token | GIT_TOKEN | Token for Git HTTPS authentication | No | |
--kube-namespace | KUBE_NAMEPSACE | Name of the Home Assistant deployment namespace in Kubernetes | homeassistant | Yes |
--kube-deployment | KUBE_DEPLOYMENT | Name of the Home Assistant deployment in Kubernetes | homeassistant | Yes |
--metrics | METRICS | Enable Prometheus metrics | false | No |
--metrics-port | METRICS_PORT | Port for Prometheus metrics service | 8080 | No |
Kubernetes service account
Since this tool uses native Kubernetes API, it uses in-cluster authentication with permissions from the service account of the pod. In order for it to restart deployments, a role and a role binding needs to be created.
Example:
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: homeassistant-sync
namespace: homeassistant
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: edit-deployments
namespace: homeassistant
rules:
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "update"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: edit-deployments-homeassistant-sync
namespace: homeassistant
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: edit-deployments
subjects:
- kind: ServiceAccount
name: homeassistant-sync
namespace: homeassistant
Observability
The tool has capability to expose Prometheus metrics. It can be enabled by setting env variable METRICS
to true
.
Exported metrics:
Metric | Type | Description |
---|---|---|
ha_git_sync_config_status | Gauge | Shows if pulled configuration is valid. Returns 1 or 0. |