Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,11 @@ Fill in the following fields:
| **Name** | ✅ | Friendly display name for this entry (must be unique across all entries) |
| **Service** | ✅ | Name of the Docker container on the remote host |
| **Host** | ✅ | Hostname or IP address of the remote server |
| **Port** | — | SSH port of the remote server (default: `22`) |
| **Username** | ✅ | SSH username |
| **Password** | ⚠️ | SSH password (use instead of `key_file`) |
| **Key file** | ⚠️ | Path to an SSH private key file on the HA host (use instead of `password`) |
| **Passphrase** | — | Passphrase for `key_file` (default: empty) |
| **Check known hosts** | — | Verify host key against known hosts (default: `true`) |
| **Known hosts** | — | Path or string of the known hosts (only valid when `check_known_hosts` is `true`) |
| **Docker command** | — | The Docker executable on the remote host, e.g. `docker`, `sudo docker`, `podman` (default: `docker`) |
Expand All @@ -96,7 +98,7 @@ Fill in the following fields:

> **Note:** Either `password` or `key_file` must be provided.

When a new entry is added the integration validates the SSH connection and verifies that the named container exists on the host before creating the entry.
When a new entry is added the integration validates the SSH connection and verifies that the named container exists on the host before creating the entry. `passphrase` is only sent to `ssh_command.execute` when a non-empty value is configured.

### ⚙️ Options

Expand Down Expand Up @@ -253,7 +255,7 @@ This service is useful for one-off diagnostic commands, health checks, or config

## 🔍 Automatic Discovery

When a new entry is successfully added, SSH Docker automatically scans the host for additional Docker containers and offers to add unconfigured ones as new entries. The discovery form is pre-filled with all SSH and Docker settings from the original entry — including the `check_for_updates` and `auto_update` values — so the user only needs to confirm the container name.
When a new entry is successfully added, SSH Docker automatically scans the host for additional Docker containers and offers to add unconfigured ones as new entries. The discovery form is pre-filled with all SSH and Docker settings from the original entry — including `port`, `check_for_updates`, and `auto_update` — so the user only needs to confirm the container name.

Discovered container names are automatically capitalized in the **Name** field (e.g., `grocy` → `Grocy`) while the **Service** field retains the original lowercase name.

Expand Down
29 changes: 25 additions & 4 deletions __init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
from homeassistant.helpers.typing import ConfigType

from .const import (
DOMAIN, CONF_KEY_FILE, CONF_CHECK_KNOWN_HOSTS, CONF_KNOWN_HOSTS,
DOMAIN, CONF_PORT, CONF_KEY_FILE, CONF_PASSPHRASE, CONF_CHECK_KNOWN_HOSTS, CONF_KNOWN_HOSTS,
CONF_DOCKER_COMMAND, CONF_AUTO_UPDATE, CONF_CHECK_FOR_UPDATES, CONF_SERVICE,
SERVICE_CREATE, SERVICE_RESTART, SERVICE_STOP, SERVICE_REMOVE, SERVICE_REFRESH,
SERVICE_GET_LOGS, SERVICE_EXECUTE_COMMAND,
DEFAULT_DOCKER_COMMAND, DEFAULT_CHECK_KNOWN_HOSTS, DEFAULT_TIMEOUT,
SERVICE_CREATE, SERVICE_RESTART, SERVICE_STOP, SERVICE_REMOVE, SERVICE_REFRESH, SERVICE_GET_LOGS,
SERVICE_EXECUTE_COMMAND, DEFAULT_DOCKER_COMMAND, DEFAULT_PORT, DEFAULT_PASSPHRASE,
DEFAULT_CHECK_KNOWN_HOSTS, DEFAULT_TIMEOUT,
DEFAULT_AUTO_UPDATE, DEFAULT_CHECK_FOR_UPDATES,
DOCKER_SERVICES_EXECUTABLE,
)
Expand Down Expand Up @@ -220,6 +220,25 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
return True


async def async_migrate_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
"""Migrate old config entries to include SSH port and passphrase defaults."""
if config_entry.version > 2:
return False

if config_entry.version == 1:
new_options = dict(config_entry.options)
new_options.setdefault(CONF_PORT, DEFAULT_PORT)
new_options.setdefault(CONF_PASSPHRASE, DEFAULT_PASSPHRASE)
hass.config_entries.async_update_entry(
config_entry,
options=new_options,
version=2,
)
_LOGGER.info("Migrated config entry %s from version 1 to 2", config_entry.entry_id)

return True


async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Unload a config entry."""
_LOGGER.debug("Unloading config entry for container %s", entry.data.get(CONF_NAME))
Expand Down Expand Up @@ -290,6 +309,7 @@ async def _discover_services(hass: HomeAssistant, entry: ConfigEntry) -> None:
CONF_SERVICE: service_name,
CONF_NAME: service_name[0].upper() + service_name[1:] if service_name else service_name,
CONF_HOST: host,
CONF_PORT: options.get(CONF_PORT, DEFAULT_PORT),
CONF_USERNAME: options.get(CONF_USERNAME, ""),
CONF_DOCKER_COMMAND: options.get(CONF_DOCKER_COMMAND, DEFAULT_DOCKER_COMMAND),
CONF_CHECK_KNOWN_HOSTS: options.get(CONF_CHECK_KNOWN_HOSTS, DEFAULT_CHECK_KNOWN_HOSTS),
Expand All @@ -300,6 +320,7 @@ async def _discover_services(hass: HomeAssistant, entry: ConfigEntry) -> None:
discovery_data[CONF_PASSWORD] = options[CONF_PASSWORD]
if options.get(CONF_KEY_FILE):
discovery_data[CONF_KEY_FILE] = options[CONF_KEY_FILE]
discovery_data[CONF_PASSPHRASE] = options.get(CONF_PASSPHRASE, DEFAULT_PASSPHRASE)
if options.get(CONF_KNOWN_HOSTS):
discovery_data[CONF_KNOWN_HOSTS] = options[CONF_KNOWN_HOSTS]

Expand Down
29 changes: 20 additions & 9 deletions config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,14 @@

from homeassistant import config_entries
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, ConfigEntry
from homeassistant.const import CONF_HOST, CONF_USERNAME, CONF_PASSWORD, CONF_NAME
from homeassistant.const import CONF_HOST, CONF_USERNAME, CONF_PASSWORD, CONF_NAME, CONF_COMMAND, CONF_TIMEOUT
from homeassistant.core import HomeAssistant, callback

from .const import (
DOMAIN, CONF_SERVICE, CONF_KEY_FILE, CONF_CHECK_KNOWN_HOSTS, CONF_KNOWN_HOSTS,
DOMAIN, CONF_SERVICE, CONF_PORT, CONF_KEY_FILE, CONF_PASSPHRASE, CONF_CHECK_KNOWN_HOSTS, CONF_KNOWN_HOSTS,
CONF_DOCKER_COMMAND, CONF_AUTO_UPDATE, CONF_CHECK_FOR_UPDATES,
DEFAULT_DOCKER_COMMAND, DEFAULT_CHECK_KNOWN_HOSTS, DEFAULT_AUTO_UPDATE, DEFAULT_CHECK_FOR_UPDATES,
DEFAULT_DOCKER_COMMAND, DEFAULT_PORT, DEFAULT_PASSPHRASE,
DEFAULT_CHECK_KNOWN_HOSTS, DEFAULT_AUTO_UPDATE, DEFAULT_CHECK_FOR_UPDATES,
SSH_COMMAND_DOMAIN, SSH_COMMAND_SERVICE_EXECUTE,
SSH_CONF_OUTPUT, SSH_CONF_EXIT_STATUS,
DOCKER_SERVICES_EXECUTABLE, DEFAULT_TIMEOUT,
Expand All @@ -30,9 +31,11 @@
vol.Required(CONF_NAME): str,
vol.Required(CONF_SERVICE): str,
vol.Required(CONF_HOST): str,
vol.Optional(CONF_PORT, default=DEFAULT_PORT): vol.All(int, vol.Range(min=1, max=65535)),
vol.Required(CONF_USERNAME): str,
Comment thread
Copilot marked this conversation as resolved.
vol.Optional(CONF_PASSWORD): str,
vol.Optional(CONF_KEY_FILE): str,
vol.Optional(CONF_PASSPHRASE, default=DEFAULT_PASSPHRASE): str,
vol.Optional(CONF_CHECK_KNOWN_HOSTS, default=DEFAULT_CHECK_KNOWN_HOSTS): bool,
vol.Optional(CONF_KNOWN_HOSTS): str,
vol.Optional(CONF_DOCKER_COMMAND, default=DEFAULT_DOCKER_COMMAND): str,
Expand Down Expand Up @@ -66,17 +69,20 @@ async def _check_service_exists(

service_data: dict[str, Any] = {
CONF_HOST: options.get(CONF_HOST, ""),
CONF_PORT: options.get(CONF_PORT, DEFAULT_PORT),
CONF_USERNAME: options.get(CONF_USERNAME, ""),
"check_known_hosts": options.get(CONF_CHECK_KNOWN_HOSTS, DEFAULT_CHECK_KNOWN_HOSTS),
"command": discover_cmd,
"timeout": DEFAULT_TIMEOUT,
CONF_CHECK_KNOWN_HOSTS: options.get(CONF_CHECK_KNOWN_HOSTS, DEFAULT_CHECK_KNOWN_HOSTS),
CONF_COMMAND: discover_cmd,
CONF_TIMEOUT: DEFAULT_TIMEOUT,
}
if options.get(CONF_PASSWORD):
service_data[CONF_PASSWORD] = options[CONF_PASSWORD]
if options.get(CONF_KEY_FILE):
service_data["key_file"] = options[CONF_KEY_FILE]
service_data[CONF_KEY_FILE] = options[CONF_KEY_FILE]
if options.get(CONF_PASSPHRASE):
service_data[CONF_PASSPHRASE] = options[CONF_PASSPHRASE]
if options.get(CONF_KNOWN_HOSTS):
service_data["known_hosts"] = options[CONF_KNOWN_HOSTS]
service_data[CONF_KNOWN_HOSTS] = options[CONF_KNOWN_HOSTS]

try:
response = await hass.services.async_call(
Expand Down Expand Up @@ -137,9 +143,14 @@ def _build_user_schema(defaults: dict[str, Any]) -> vol.Schema:
vol.Required(CONF_NAME, default=defaults.get(CONF_NAME, "")): str,
vol.Required(CONF_SERVICE, default=defaults.get(CONF_SERVICE, "")): str,
vol.Required(CONF_HOST, default=defaults.get(CONF_HOST, "")): str,
vol.Optional(CONF_PORT, default=defaults.get(CONF_PORT, DEFAULT_PORT)): int,
vol.Required(CONF_USERNAME, default=defaults.get(CONF_USERNAME, "")): str,
vol.Optional(CONF_PASSWORD, default=defaults.get(CONF_PASSWORD, "")): str,
vol.Optional(CONF_KEY_FILE, default=defaults.get(CONF_KEY_FILE, "")): str,
vol.Optional(
CONF_PASSPHRASE,
default=defaults.get(CONF_PASSPHRASE, DEFAULT_PASSPHRASE),
): str,
vol.Optional(
CONF_CHECK_KNOWN_HOSTS,
default=defaults.get(CONF_CHECK_KNOWN_HOSTS, DEFAULT_CHECK_KNOWN_HOSTS),
Expand All @@ -164,7 +175,7 @@ def _build_user_schema(defaults: dict[str, Any]) -> vol.Schema:
class SshDockerConfigFlow(ConfigFlow, domain=DOMAIN):
"""Handle a config flow for SSH Docker."""

VERSION = 1
VERSION = 2

async def async_step_user(
self, user_input: dict[str, Any] | None = None
Expand Down
4 changes: 4 additions & 0 deletions const.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@


CONF_SERVICE = "service"
CONF_PORT = "port"
CONF_KEY_FILE = "key_file"
CONF_PASSPHRASE = "passphrase"
CONF_CHECK_KNOWN_HOSTS = "check_known_hosts"
CONF_KNOWN_HOSTS = "known_hosts"
CONF_DOCKER_COMMAND = "docker_command"
Expand Down Expand Up @@ -34,6 +36,8 @@
SERVICE_EXECUTE_COMMAND = "execute_command"

DEFAULT_DOCKER_COMMAND = "docker"
DEFAULT_PORT = 22
DEFAULT_PASSPHRASE = ""
DEFAULT_CHECK_KNOWN_HOSTS = True
DEFAULT_AUTO_UPDATE = False
DEFAULT_CHECK_FOR_UPDATES = False
Expand Down
19 changes: 11 additions & 8 deletions coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,17 @@
from typing import Any

from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, CONF_NAME, CONF_USERNAME, CONF_PASSWORD
from homeassistant.const import CONF_HOST, CONF_NAME, CONF_USERNAME, CONF_PASSWORD, CONF_COMMAND, CONF_TIMEOUT
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError, ServiceValidationError

from .const import (
DOMAIN, CONF_SERVICE, CONF_KEY_FILE, CONF_CHECK_KNOWN_HOSTS, CONF_KNOWN_HOSTS,
DOMAIN, CONF_SERVICE, CONF_PORT, CONF_KEY_FILE, CONF_PASSPHRASE, CONF_CHECK_KNOWN_HOSTS, CONF_KNOWN_HOSTS,
CONF_DOCKER_COMMAND, CONF_AUTO_UPDATE, CONF_CHECK_FOR_UPDATES, CONF_UPDATE_AVAILABLE,
CONF_CREATED, CONF_IMAGE,
SSH_COMMAND_DOMAIN, SSH_COMMAND_SERVICE_EXECUTE,
SSH_CONF_OUTPUT, SSH_CONF_EXIT_STATUS,
DEFAULT_DOCKER_COMMAND, DEFAULT_CHECK_KNOWN_HOSTS, DEFAULT_TIMEOUT,
DEFAULT_DOCKER_COMMAND, DEFAULT_PORT, DEFAULT_CHECK_KNOWN_HOSTS, DEFAULT_TIMEOUT,
DOCKER_CREATE_EXECUTABLE, DOCKER_CREATE_TIMEOUT, DOCKER_PULL_TIMEOUT,
DOCKER_SERVICES_EXECUTABLE,
get_ssh_semaphore,
Expand Down Expand Up @@ -76,17 +76,20 @@ async def _ssh_run(
)
service_data: dict[str, Any] = {
CONF_HOST: options[CONF_HOST],
CONF_PORT: options.get(CONF_PORT, DEFAULT_PORT),
CONF_USERNAME: options[CONF_USERNAME],
"check_known_hosts": options.get(CONF_CHECK_KNOWN_HOSTS, DEFAULT_CHECK_KNOWN_HOSTS),
"command": command,
"timeout": timeout,
CONF_CHECK_KNOWN_HOSTS: options.get(CONF_CHECK_KNOWN_HOSTS, DEFAULT_CHECK_KNOWN_HOSTS),
CONF_COMMAND: command,
CONF_TIMEOUT: timeout,
}
if options.get(CONF_PASSWORD):
service_data[CONF_PASSWORD] = options[CONF_PASSWORD]
if options.get(CONF_KEY_FILE):
service_data["key_file"] = options[CONF_KEY_FILE]
service_data[CONF_KEY_FILE] = options[CONF_KEY_FILE]
if options.get(CONF_PASSPHRASE):
service_data[CONF_PASSPHRASE] = options[CONF_PASSPHRASE]
if options.get(CONF_KNOWN_HOSTS):
service_data["known_hosts"] = options[CONF_KNOWN_HOSTS]
service_data[CONF_KNOWN_HOSTS] = options[CONF_KNOWN_HOSTS]

async def _call() -> Any:
return await hass.services.async_call(
Expand Down
31 changes: 21 additions & 10 deletions options_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@

import voluptuous as vol
from homeassistant.config_entries import OptionsFlow, ConfigFlowResult
from homeassistant.const import CONF_HOST, CONF_USERNAME, CONF_PASSWORD
from homeassistant.const import CONF_HOST, CONF_USERNAME, CONF_PASSWORD, CONF_COMMAND, CONF_TIMEOUT
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ServiceValidationError, HomeAssistantError

from .const import (
CONF_KEY_FILE, CONF_CHECK_KNOWN_HOSTS, CONF_KNOWN_HOSTS,
CONF_PORT, CONF_KEY_FILE, CONF_PASSPHRASE, CONF_CHECK_KNOWN_HOSTS, CONF_KNOWN_HOSTS,
CONF_DOCKER_COMMAND, CONF_AUTO_UPDATE, CONF_CHECK_FOR_UPDATES,
DEFAULT_DOCKER_COMMAND, DEFAULT_CHECK_KNOWN_HOSTS, DEFAULT_AUTO_UPDATE,
DEFAULT_DOCKER_COMMAND, DEFAULT_PORT, DEFAULT_PASSPHRASE, DEFAULT_CHECK_KNOWN_HOSTS, DEFAULT_AUTO_UPDATE,
DEFAULT_CHECK_FOR_UPDATES, DEFAULT_TIMEOUT,
SSH_COMMAND_DOMAIN, SSH_COMMAND_SERVICE_EXECUTE, SSH_CONF_EXIT_STATUS,
)
Expand All @@ -40,17 +40,20 @@ async def validate_and_build_options(

service_data: dict[str, Any] = {
CONF_HOST: user_input[CONF_HOST],
CONF_PORT: user_input.get(CONF_PORT, DEFAULT_PORT),
CONF_USERNAME: user_input[CONF_USERNAME],
"check_known_hosts": user_input.get(CONF_CHECK_KNOWN_HOSTS, DEFAULT_CHECK_KNOWN_HOSTS),
"command": f"{docker_cmd} ps -q",
"timeout": DEFAULT_TIMEOUT,
CONF_CHECK_KNOWN_HOSTS: user_input.get(CONF_CHECK_KNOWN_HOSTS, DEFAULT_CHECK_KNOWN_HOSTS),
CONF_COMMAND: f"{docker_cmd} ps -q",
CONF_TIMEOUT: DEFAULT_TIMEOUT,
}
if has_password:
service_data[CONF_PASSWORD] = user_input[CONF_PASSWORD]
if has_key_file:
service_data["key_file"] = user_input[CONF_KEY_FILE]
service_data[CONF_KEY_FILE] = user_input[CONF_KEY_FILE]
if user_input.get(CONF_PASSPHRASE):
service_data[CONF_PASSPHRASE] = user_input[CONF_PASSPHRASE]
if user_input.get(CONF_KNOWN_HOSTS):
service_data["known_hosts"] = user_input[CONF_KNOWN_HOSTS]
service_data[CONF_KNOWN_HOSTS] = user_input[CONF_KNOWN_HOSTS]

_LOGGER.debug(
"Validating SSH connection to %s as %s",
Expand Down Expand Up @@ -99,7 +102,9 @@ async def validate_and_build_options(
_LOGGER.debug("SSH validation successful for host %s", user_input[CONF_HOST])
options: dict[str, Any] = {
CONF_HOST: user_input[CONF_HOST],
CONF_PORT: user_input.get(CONF_PORT, DEFAULT_PORT),
CONF_USERNAME: user_input[CONF_USERNAME],
CONF_PASSPHRASE: user_input.get(CONF_PASSPHRASE, DEFAULT_PASSPHRASE),
CONF_CHECK_KNOWN_HOSTS: user_input.get(CONF_CHECK_KNOWN_HOSTS, DEFAULT_CHECK_KNOWN_HOSTS),
CONF_DOCKER_COMMAND: docker_cmd,
CONF_AUTO_UPDATE: user_input.get(CONF_AUTO_UPDATE, DEFAULT_AUTO_UPDATE),
Expand All @@ -115,12 +120,13 @@ async def validate_and_build_options(
return options, None


STEP_OPTIONS_DATA_SCHEMA = vol.Schema(
{
STEP_OPTIONS_DATA_SCHEMA = vol.Schema({
vol.Required(CONF_HOST): str,
vol.Optional(CONF_PORT, default=DEFAULT_PORT): vol.All(int, vol.Range(min=1, max=65535)),
vol.Required(CONF_USERNAME): str,
vol.Optional(CONF_PASSWORD): str,
vol.Optional(CONF_KEY_FILE): str,
vol.Optional(CONF_PASSPHRASE, default=DEFAULT_PASSPHRASE): str,
vol.Optional(CONF_CHECK_KNOWN_HOSTS, default=DEFAULT_CHECK_KNOWN_HOSTS): bool,
vol.Optional(CONF_KNOWN_HOSTS): str,
vol.Optional(CONF_DOCKER_COMMAND, default=DEFAULT_DOCKER_COMMAND): str,
Expand Down Expand Up @@ -156,9 +162,14 @@ async def async_step_init(
schema = vol.Schema(
{
vol.Required(CONF_HOST, default=current.get(CONF_HOST, "")): str,
vol.Optional(CONF_PORT, default=current.get(CONF_PORT, DEFAULT_PORT)): int,
vol.Required(CONF_USERNAME, default=current.get(CONF_USERNAME, "")): str,
vol.Optional(CONF_PASSWORD, default=current.get(CONF_PASSWORD, "")): str,
vol.Optional(CONF_KEY_FILE, default=current.get(CONF_KEY_FILE, "")): str,
vol.Optional(
CONF_PASSPHRASE,
default=current.get(CONF_PASSPHRASE, DEFAULT_PASSPHRASE),
): str,
vol.Optional(
CONF_CHECK_KNOWN_HOSTS,
default=current.get(CONF_CHECK_KNOWN_HOSTS, DEFAULT_CHECK_KNOWN_HOSTS),
Expand Down
8 changes: 8 additions & 0 deletions strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@
"name": "Name",
"service": "Service",
"host": "Host",
"port": "Port",
"username": "Username",
"password": "Password",
"key_file": "Key File",
"passphrase": "Passphrase",
"check_known_hosts": "Check Known Hosts",
"known_hosts": "Known Hosts",
"docker_command": "Docker Command",
Expand All @@ -21,9 +23,11 @@
"name": "A friendly display name for this container in Home Assistant (e.g. My Web Server).",
"service": "The exact container name on the remote host, as shown by `docker ps` (e.g. my_web_server).",
"host": "IP address or hostname of the remote machine running Docker.",
"port": "SSH port of the remote host (default: 22).",
"username": "SSH username used to connect to the remote host.",
"password": "SSH password. Leave empty if authenticating with a key file.",
"key_file": "Absolute path to the SSH private key file on the Home Assistant machine. Leave empty if authenticating with a password.",
"passphrase": "Passphrase for the SSH private key file. Leave empty if the key has no passphrase.",
"check_known_hosts": "Verify the remote host against a known_hosts file before connecting.",
"known_hosts": "Absolute path to the SSH known_hosts file on the Home Assistant machine.",
"docker_command": "Docker executable to use on the remote host (e.g. `docker` or `sudo docker`).",
Expand Down Expand Up @@ -54,9 +58,11 @@
"title": "Update Docker Container Options",
"data": {
"host": "Host",
"port": "Port",
"username": "Username",
"password": "Password",
"key_file": "Key File",
"passphrase": "Passphrase",
"check_known_hosts": "Check Known Hosts",
"known_hosts": "Known Hosts",
"docker_command": "Docker Command",
Expand All @@ -65,9 +71,11 @@
},
"data_description": {
"host": "IP address or hostname of the remote machine running Docker.",
"port": "SSH port of the remote host (default: 22).",
"username": "SSH username used to connect to the remote host.",
"password": "SSH password. Leave empty if authenticating with a key file.",
"key_file": "Absolute path to the SSH private key file on the Home Assistant machine. Leave empty if authenticating with a password.",
"passphrase": "Passphrase for the SSH private key file. Leave empty if the key has no passphrase.",
"check_known_hosts": "Verify the remote host against a known_hosts file before connecting.",
"known_hosts": "Absolute path to the SSH known_hosts file on the Home Assistant machine.",
"docker_command": "Docker executable to use on the remote host (e.g. `docker` or `sudo docker`).",
Expand Down
Loading
Loading