From 9c9dd3f85e8a9c051ff7574309520cce3293ceb4 Mon Sep 17 00:00:00 2001 From: wheelz Date: Thu, 9 Jul 2026 14:40:53 +0000 Subject: [PATCH] chore: add Arcane and Dockhand TrueNAS compose files --- arcane-truenas-compose.yml | 51 ++++++++++++++++++++++++++++++++++++ arcane-truenas.env.example | 24 +++++++++++++++++ dockhand-truenas-compose.yml | 37 ++++++++++++++++++++++++++ dockhand-truenas.env.example | 13 +++++++++ 4 files changed, 125 insertions(+) create mode 100644 arcane-truenas-compose.yml create mode 100644 arcane-truenas.env.example create mode 100644 dockhand-truenas-compose.yml create mode 100644 dockhand-truenas.env.example diff --git a/arcane-truenas-compose.yml b/arcane-truenas-compose.yml new file mode 100644 index 0000000..2e9c8ac --- /dev/null +++ b/arcane-truenas-compose.yml @@ -0,0 +1,51 @@ +# ============================================ +# Arcane — TrueNAS Compose Draft +# ============================================ +# Target: TrueNAS regular Docker / Portainer Compose deployment. +# Source pattern: +# - TrueNAS Docker data root: /mnt/HomeStorage02/Docker//... +# - Container user convention: PUID=568 / PGID=568 where supported. +# +# Deploy after review: +# docker compose --env-file arcane-truenas.env -f arcane-truenas-compose.yml up -d +# +# Validate: +# docker compose --env-file arcane-truenas.env.example -f arcane-truenas-compose.yml config +# +# Notes: +# - Arcane needs access to /var/run/docker.sock to manage the local Docker host. +# - Keep ENCRYPTION_KEY and JWT_SECRET runtime-only; generate them on TrueNAS. +# - Keep the Docker socket exposure LAN/VPN-only; do not expose this UI publicly. +# - ARCANE_PROJECTS_DIRECTORY is bind-mounted at the same host/container path so +# Arcane-created Compose projects resolve correctly on the Docker host. +# ============================================ + +services: + arcane: + image: ${ARCANE_IMAGE:-ghcr.io/getarcaneapp/manager}:${ARCANE_TAG:-latest} + container_name: arcane + restart: unless-stopped + init: true + ports: + - "${ARCANE_HTTP_PORT:-3552}:3552" + environment: + ENCRYPTION_KEY: ${ENCRYPTION_KEY:?set ENCRYPTION_KEY in arcane-truenas.env} + JWT_SECRET: ${JWT_SECRET:?set JWT_SECRET in arcane-truenas.env} + PROJECTS_DIRECTORY: ${ARCANE_PROJECTS_DIRECTORY:-/mnt/HomeStorage02/Docker/Arcane/projects} + TZ: ${TZ:-America/Chicago} + PUID: ${PUID:-568} + PGID: ${PGID:-568} + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ${TRUENAS_DOCKER_ROOT:-/mnt/HomeStorage02/Docker}/Arcane/data:/app/data + - ${ARCANE_PROJECTS_DIRECTORY:-/mnt/HomeStorage02/Docker/Arcane/projects}:${ARCANE_PROJECTS_DIRECTORY:-/mnt/HomeStorage02/Docker/Arcane/projects} + - ${TRUENAS_DOCKER_ROOT:-/mnt/HomeStorage02/Docker}/Arcane/builds:/builds + cgroup: host + security_opt: + - no-new-privileges:true + healthcheck: + test: ["CMD", "./arcane", "health", "--timeout", "2s"] + interval: 10s + timeout: 3s + retries: 5 + start_period: 15s diff --git a/arcane-truenas.env.example b/arcane-truenas.env.example new file mode 100644 index 0000000..19355cf --- /dev/null +++ b/arcane-truenas.env.example @@ -0,0 +1,24 @@ +# Arcane TrueNAS environment example for Wheelz's HomeLab. +# Copy to arcane-truenas.env on TrueNAS/Portainer and fill runtime-only values there. +# Do not commit real secrets. + +ARCANE_IMAGE=ghcr.io/getarcaneapp/manager +ARCANE_TAG=latest +ARCANE_HTTP_PORT=3552 +TZ=America/Chicago + +# Wheelz TrueNAS Docker directory pattern. +TRUENAS_DOCKER_ROOT=/mnt/HomeStorage02/Docker +PUID=568 +PGID=568 + +# Arcane secrets. Generate on the deployment host and do not commit real values. +# Example commands: +# openssl rand -hex 32 +# openssl rand -hex 32 +ENCRYPTION_KEY=replace_me_with_a_random_32_byte_hex_value +JWT_SECRET=replace_me_with_a_random_32_byte_hex_value + +# Arcane Compose project storage. This path is mounted into the container at the +# same path so Docker can resolve project files from the host side. +ARCANE_PROJECTS_DIRECTORY=/mnt/HomeStorage02/Docker/Arcane/projects diff --git a/dockhand-truenas-compose.yml b/dockhand-truenas-compose.yml new file mode 100644 index 0000000..037ec25 --- /dev/null +++ b/dockhand-truenas-compose.yml @@ -0,0 +1,37 @@ +# ============================================ +# Dockhand — TrueNAS Compose Draft +# ============================================ +# Target: TrueNAS regular Docker / Portainer Compose deployment. +# Source pattern: +# - TrueNAS Docker data root: /mnt/HomeStorage02/Docker//... +# - Container user convention: PUID=568 / PGID=568 where supported. +# +# Deploy after review: +# docker compose --env-file dockhand-truenas.env -f dockhand-truenas-compose.yml up -d +# +# Validate: +# docker compose --env-file dockhand-truenas.env.example -f dockhand-truenas-compose.yml config +# +# Notes: +# - Dockhand needs access to /var/run/docker.sock to manage the local Docker host. +# - Keep the Docker socket exposure LAN/VPN-only; do not expose this UI publicly. +# - Persistent app data is stored under /app/data. +# ============================================ + +services: + dockhand: + image: ${DOCKHAND_IMAGE:-fnsys/dockhand}:${DOCKHAND_TAG:-latest} + container_name: dockhand + restart: unless-stopped + init: true + ports: + - "${DOCKHAND_HTTP_PORT:-3000}:3000" + environment: + TZ: ${TZ:-America/Chicago} + PUID: ${PUID:-568} + PGID: ${PGID:-568} + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ${TRUENAS_DOCKER_ROOT:-/mnt/HomeStorage02/Docker}/Dockhand/data:/app/data + security_opt: + - no-new-privileges:true diff --git a/dockhand-truenas.env.example b/dockhand-truenas.env.example new file mode 100644 index 0000000..d2d0d18 --- /dev/null +++ b/dockhand-truenas.env.example @@ -0,0 +1,13 @@ +# Dockhand TrueNAS environment example for Wheelz's HomeLab. +# Copy to dockhand-truenas.env on TrueNAS/Portainer and adjust runtime values there. +# Do not commit real secrets. + +DOCKHAND_IMAGE=fnsys/dockhand +DOCKHAND_TAG=latest +DOCKHAND_HTTP_PORT=3000 +TZ=America/Chicago + +# Wheelz TrueNAS Docker directory pattern. +TRUENAS_DOCKER_ROOT=/mnt/HomeStorage02/Docker +PUID=568 +PGID=568