homeassistant: Run service as non root user
This commit is contained in:
parent
8b90b85b8f
commit
ec1b8cb9e6
4 changed files with 193 additions and 10 deletions
|
@ -1 +1 @@
|
||||||
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE="0660", GROUP="ha"
|
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE="0660", GROUP="homeassistant"
|
||||||
|
|
139
roles/homeassistant/files/homeassistant-docker-venv.patch
Normal file
139
roles/homeassistant/files/homeassistant-docker-venv.patch
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
--- run.orig 2025-01-28 08:45:53.981024625 +0000
|
||||||
|
+++ run 2025-01-28 08:45:38.177986885 +0000
|
||||||
|
@@ -21,49 +21,52 @@
|
||||||
|
# Create user
|
||||||
|
#
|
||||||
|
|
||||||
|
-# Some HA commands seem to fail if we don't have an actual user.
|
||||||
|
-# ie: shell_command would return error code 255
|
||||||
|
-bashio::log.info "Creating user $USER with $PUID:$PGID"
|
||||||
|
-
|
||||||
|
-deluser "$USER" >/dev/null 2>&1 || true
|
||||||
|
-delgroup "$GROUP" >/dev/null 2>&1 || true
|
||||||
|
-
|
||||||
|
-# Re-use existing group (can't delgroup a group that is in use)
|
||||||
|
-group="$(getent group "$PGID" | cut -d: -f1 || true)"
|
||||||
|
-if [ -z "$group" ]; then
|
||||||
|
- addgroup -g "$PGID" "$GROUP"
|
||||||
|
-else
|
||||||
|
- bashio::log.notice "Re-using existing group with gid $PGID: $group"
|
||||||
|
- GROUP="$group"
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
-# Replace existing user (ensures correct shell and primary group)
|
||||||
|
-user="$(getent passwd "$PUID" | cut -d: -f1 || true)"
|
||||||
|
-if [ -n "$user" ]; then
|
||||||
|
- bashio::log.notice "Replacing existing user with uid $PUID: $user"
|
||||||
|
- deluser "$user"
|
||||||
|
-fi
|
||||||
|
-adduser -G "$GROUP" -D -u "$PUID" "$USER"
|
||||||
|
+if [ "$(whoami)" != "homeassistant" ]; then
|
||||||
|
|
||||||
|
-if [ -n "${EXTRA_GID:-}" ]; then
|
||||||
|
- bashio::log.info "Resolving supplementary GIDs: $EXTRA_GID"
|
||||||
|
- supplementary_groups=()
|
||||||
|
-
|
||||||
|
- for gid in $EXTRA_GID; do
|
||||||
|
- group="$(getent group "$gid" | cut -d: -f1 || true)"
|
||||||
|
-
|
||||||
|
- if [ -z "$group" ]; then
|
||||||
|
- group="$USER-$gid"
|
||||||
|
- addgroup -g "$gid" "$group"
|
||||||
|
- fi
|
||||||
|
+ # Some HA commands seem to fail if we don't have an actual user.
|
||||||
|
+ # ie: shell_command would return error code 255
|
||||||
|
+ bashio::log.info "Creating user $USER with $PUID:$PGID"
|
||||||
|
+
|
||||||
|
+ deluser "$USER" >/dev/null 2>&1 || true
|
||||||
|
+ delgroup "$GROUP" >/dev/null 2>&1 || true
|
||||||
|
+
|
||||||
|
+ # Re-use existing group (can't delgroup a group that is in use)
|
||||||
|
+ group="$(getent group "$PGID" | cut -d: -f1 || true)"
|
||||||
|
+ if [ -z "$group" ]; then
|
||||||
|
+ addgroup -g "$PGID" "$GROUP"
|
||||||
|
+ else
|
||||||
|
+ bashio::log.notice "Re-using existing group with gid $PGID: $group"
|
||||||
|
+ GROUP="$group"
|
||||||
|
+ fi
|
||||||
|
|
||||||
|
- supplementary_groups+=( "$group" )
|
||||||
|
- done
|
||||||
|
+ # Replace existing user (ensures correct shell and primary group)
|
||||||
|
+ user="$(getent passwd "$PUID" | cut -d: -f1 || true)"
|
||||||
|
+ if [ -n "$user" ]; then
|
||||||
|
+ bashio::log.notice "Replacing existing user with uid $PUID: $user"
|
||||||
|
+ deluser "$user"
|
||||||
|
+ fi
|
||||||
|
+ adduser -G "$GROUP" -D -u "$PUID" "$USER"
|
||||||
|
|
||||||
|
- bashio::log.info "Appending supplementary groups: ${supplementary_groups[*]}"
|
||||||
|
- for group in "${supplementary_groups[@]}"; do
|
||||||
|
- addgroup "$USER" "$group"
|
||||||
|
- done
|
||||||
|
+ if [ -n "${EXTRA_GID:-}" ]; then
|
||||||
|
+ bashio::log.info "Resolving supplementary GIDs: $EXTRA_GID"
|
||||||
|
+ supplementary_groups=()
|
||||||
|
+
|
||||||
|
+ for gid in $EXTRA_GID; do
|
||||||
|
+ group="$(getent group "$gid" | cut -d: -f1 || true)"
|
||||||
|
+
|
||||||
|
+ if [ -z "$group" ]; then
|
||||||
|
+ group="$USER-$gid"
|
||||||
|
+ addgroup -g "$gid" "$group"
|
||||||
|
+ fi
|
||||||
|
+
|
||||||
|
+ supplementary_groups+=( "$group" )
|
||||||
|
+ done
|
||||||
|
+
|
||||||
|
+ bashio::log.info "Appending supplementary groups: ${supplementary_groups[*]}"
|
||||||
|
+ for group in "${supplementary_groups[@]}"; do
|
||||||
|
+ addgroup "$USER" "$group"
|
||||||
|
+ done
|
||||||
|
+ fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
#
|
||||||
|
@@ -82,8 +85,12 @@
|
||||||
|
#
|
||||||
|
|
||||||
|
bashio::log.info "Initializing venv in $VENV_PATH"
|
||||||
|
-su "$USER" \
|
||||||
|
- -c "python3 -m venv --system-site-packages '$VENV_PATH'"
|
||||||
|
+if [ "$(whoami)" = "homeassistant" ]; then
|
||||||
|
+ python3 -m venv --system-site-package "$VENV_PATH"
|
||||||
|
+else
|
||||||
|
+ su "$USER" \
|
||||||
|
+ -c "python3 -m venv --system-site-packages '$VENV_PATH'"
|
||||||
|
+fi
|
||||||
|
|
||||||
|
#
|
||||||
|
# Fix permissions
|
||||||
|
@@ -104,8 +111,12 @@
|
||||||
|
export UV_SYSTEM_PYTHON=false
|
||||||
|
|
||||||
|
bashio::log.info "Installing uv into venv"
|
||||||
|
-uv --version && su "$USER" \
|
||||||
|
- -c "uv pip freeze --system|grep ^uv=|xargs uv pip install"
|
||||||
|
+if [ "$(whoami)" = "homeassistant" ]; then
|
||||||
|
+ uv --version && uv pip freeze --system|grep ^uv=|xargs uv pip install
|
||||||
|
+else
|
||||||
|
+ uv --version && su "$USER" \
|
||||||
|
+ -c "uv pip freeze --system|grep ^uv=|xargs uv pip install"
|
||||||
|
+fi
|
||||||
|
|
||||||
|
bashio::log.info "Setting new \$HOME"
|
||||||
|
HOME="$( getent passwd "$USER" | cut -d: -f6 )"
|
||||||
|
@@ -122,6 +133,10 @@
|
||||||
|
fi
|
||||||
|
|
||||||
|
bashio::log.info "Starting homeassistant"
|
||||||
|
-exec \
|
||||||
|
- s6-setuidgid "$USER" \
|
||||||
|
- python3 -m homeassistant --config "$CONFIG_PATH"
|
||||||
|
+if [ "$(whoami)" = "homeassistant" ]; then
|
||||||
|
+ exec python3 -m homeassistant --config "$CONFIG_PATH"
|
||||||
|
+else
|
||||||
|
+ exec \
|
||||||
|
+ s6-setuidgid "$USER" \
|
||||||
|
+ python3 -m homeassistant --config "$CONFIG_PATH"
|
||||||
|
+fi
|
|
@ -1,13 +1,13 @@
|
||||||
---
|
---
|
||||||
- name: Create group
|
- name: Create group
|
||||||
ansible.builtin.group:
|
ansible.builtin.group:
|
||||||
name: ha
|
name: homeassistant
|
||||||
|
|
||||||
- name: Create user
|
- name: Create user
|
||||||
ansible.builtin.user:
|
ansible.builtin.user:
|
||||||
name: ha
|
name: homeassistant
|
||||||
comment: Podman HomeAssistant
|
comment: Podman HomeAssistant
|
||||||
group: ha
|
group: homeassistant
|
||||||
shell: /sbin/nologin
|
shell: /sbin/nologin
|
||||||
|
|
||||||
- name: Enable user lingering
|
- name: Enable user lingering
|
||||||
|
@ -15,8 +15,8 @@
|
||||||
argv:
|
argv:
|
||||||
- loginctl
|
- loginctl
|
||||||
- enable-linger
|
- enable-linger
|
||||||
- ha
|
- homeassistant
|
||||||
creates: /var/lib/systemd/linger/ha
|
creates: /var/lib/systemd/linger/homeassistant
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
ansible.builtin.package:
|
ansible.builtin.package:
|
||||||
|
@ -25,6 +25,46 @@
|
||||||
with_items:
|
with_items:
|
||||||
- bluez
|
- bluez
|
||||||
- git
|
- git
|
||||||
|
- patch
|
||||||
|
|
||||||
|
- name: Get venv support for container
|
||||||
|
ansible.builtin.git:
|
||||||
|
dest: /usr/local/src/homeassistant-docker-venv
|
||||||
|
repo: https://github.com/tribut/homeassistant-docker-venv.git
|
||||||
|
update: true
|
||||||
|
version: master
|
||||||
|
register: git_result
|
||||||
|
|
||||||
|
- name: Create venv support directory
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /usr/local/libexec/homeassistant-docker-venv
|
||||||
|
state: directory
|
||||||
|
mode: "0755"
|
||||||
|
owner: root
|
||||||
|
group: "{{ ansible_wheel }}"
|
||||||
|
|
||||||
|
- name: Check if venv support script exists
|
||||||
|
ansible.builtin.stat:
|
||||||
|
path: /usr/local/libexec/homeassistant-docker-venv/run
|
||||||
|
changed_when: false
|
||||||
|
register: stat_result
|
||||||
|
|
||||||
|
- name: Copy venv support script
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /usr/local/libexec/homeassistant-docker-venv/run
|
||||||
|
src: /usr/local/src/homeassistant-docker-venv/run
|
||||||
|
mode: "0755"
|
||||||
|
owner: root
|
||||||
|
group: "{{ ansible_wheel }}"
|
||||||
|
remote_src: true
|
||||||
|
when: not stat_result.stat.exists or git_result.changed
|
||||||
|
|
||||||
|
# https://github.com/home-assistant/core/issues/128214
|
||||||
|
- name: Patch venv support script
|
||||||
|
ansible.posix.patch:
|
||||||
|
dest: /usr/local/libexec/homeassistant-docker-venv/run
|
||||||
|
src: homeassistant-docker-venv.patch
|
||||||
|
notify: Restart homeassistant
|
||||||
|
|
||||||
- name: Enable bluetooth services
|
- name: Enable bluetooth services
|
||||||
ansible.builtin.service:
|
ansible.builtin.service:
|
||||||
|
@ -69,7 +109,7 @@
|
||||||
state: true
|
state: true
|
||||||
persistent: true
|
persistent: true
|
||||||
|
|
||||||
- name: Allow ha to connect specific devices
|
- name: Allow homeassistant to connect specific devices
|
||||||
ansible.builtin.copy:
|
ansible.builtin.copy:
|
||||||
dest: /etc/udev/rules.d/99-homeassistant.rules
|
dest: /etc/udev/rules.d/99-homeassistant.rules
|
||||||
src: 99-homeassistant.rules
|
src: 99-homeassistant.rules
|
||||||
|
@ -83,8 +123,8 @@
|
||||||
path: /export/homeassistant
|
path: /export/homeassistant
|
||||||
state: directory
|
state: directory
|
||||||
mode: "0700"
|
mode: "0700"
|
||||||
owner: ha
|
owner: homeassistant
|
||||||
group: ha
|
group: homeassistant
|
||||||
setype: _default
|
setype: _default
|
||||||
|
|
||||||
- name: Link config directory
|
- name: Link config directory
|
||||||
|
|
|
@ -4,15 +4,19 @@ Wants=network-online.target
|
||||||
After=network-online.target
|
After=network-online.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
User=ha
|
User=homeassistant
|
||||||
ExecStart=/usr/bin/podman run \
|
ExecStart=/usr/bin/podman run \
|
||||||
--rm -p 127.0.0.1:8008:8123 \
|
--rm -p 127.0.0.1:8008:8123 \
|
||||||
--name homeassistant \
|
--name homeassistant \
|
||||||
|
--env PGID=1000 \
|
||||||
|
--env PUID=1000 \
|
||||||
--env TZ=Europe/Helsinki \
|
--env TZ=Europe/Helsinki \
|
||||||
|
--env UMASK=007 \
|
||||||
--userns keep-id \
|
--userns keep-id \
|
||||||
--device /dev/ttyUSB0 \
|
--device /dev/ttyUSB0 \
|
||||||
--volume /run/dbus:/run/dbus:ro \
|
--volume /run/dbus:/run/dbus:ro \
|
||||||
--volume /srv/homeassistant:/config:rw \
|
--volume /srv/homeassistant:/config:rw \
|
||||||
|
--volume /usr/local/libexec/homeassistant-docker-venv/run:/etc/services.d/home-assistant/run:ro \
|
||||||
docker.io/homeassistant/home-assistant:{{ homeassistant_version }}
|
docker.io/homeassistant/home-assistant:{{ homeassistant_version }}
|
||||||
ExecStop=/usr/bin/podman stop --ignore homeassistant
|
ExecStop=/usr/bin/podman stop --ignore homeassistant
|
||||||
ExecStopPost=/usr/bin/podman rm -f --ignore homeassistant
|
ExecStopPost=/usr/bin/podman rm -f --ignore homeassistant
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue