From d44300f87972b9191f675b18ed77d751d289459a Mon Sep 17 00:00:00 2001 From: "Trez.One" Date: Sun, 7 Dec 2025 09:09:17 -0500 Subject: [PATCH 1/6] Wyoming satellite stack. --- docker-compose.yml | 111 ++++++++++++++++----------------------------- 1 file changed, 39 insertions(+), 72 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index a6d6713..4bc0004 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,78 +17,6 @@ services: - beszel-agent-data:/var/lib/beszel-agent - /var/run/docker.sock:/var/run/docker.sock:ro - /dev/mmcblk0:/extra-filesystems/dev/mmcblk0:ro - docker-socket-proxy: - container_name: dockerproxy - environment: - AUTH: 1 - BUILD: 1 - COMMIT: 1 - CONFIGS: 1 - CONTAINERS: 1 - DISTRIBUTION: 1 - EVENTS: 1 - EXEC: 1 - GPRC: 1 - IMAGES: 1 - INFO: 1 - NETWORKS: 1 - NODES: 1 - POST: 1 - PLUGINS: 1 - SERVICES: 1 - SESSION: 1 - SYSTEM: 1 - TASKS: 1 - VOLUMES: 1 - LOG_LEVEL: debug - image: ghcr.io/tecnativa/docker-socket-proxy:latest@sha256:3400c429c5f9e1b21d62130fb93b16e2e772d4fb7695bd52fc2b743800b9fe9e - ports: - - 2375:2375 - privileged: true - restart: unless-stopped - volumes: - - /var/run/docker.sock:/var/run/docker.sock - hivemind_satellite: - container_name: hivemind_satellite - hostname: hivemind_satellite - restart: unless-stopped - image: smartgic/hivemind-satellite:alpha@sha256:3057968a493fab9dcca9e1274757bd7fe61d9b143ae2900939e1ec5bbc96664a - pull_policy: always - network_mode: host - devices: - - /dev/snd - environment: - TZ: ${TZ} - VOICE_SAT_HOST: 192.168.1.248 - VOICE_SAT_PORT: ${VOICE_SAT_PORT:-5678} - VOICE_SAT_KEY: ${HV_VOICE_SAT_KEY} - VOICE_SAT_PASSWORD: ${HV_VOICE_SAT_PASSWORD} - XDG_RUNTIME_DIR: ${XDG_RUNTIME_DIR} - PULSE_SERVER: unix:${XDG_RUNTIME_DIR}/pulse/native - volumes: - - ~/.config/pulse/cookie:/home/${HIVEMIND_USER}/.config/pulse/cookie:ro - - ${BENEDIKTA_DOCKER_DIR}/hivemind:/home/${HIVEMIND_USER}/.config/hivemind - - ${BENEDIKTA_DOCKER_DIR}/mycroft:/home/${HIVEMIND_USER}/.config/mycroft - - hv_ovos_tts_cache:/home/${HIVEMIND_USER}/.cache/mycroft - - hv_ovos_listener_records:/home/${HIVEMIND_USER}/.local/share/mycroft/listener - - hv_ovos_models:/home/${HIVEMIND_USER}/.local/share/precise-lite - - ${XDG_RUNTIME_DIR}/pipewire-0:${XDG_RUNTIME_DIR}/pipewire-0:ro - - ${XDG_RUNTIME_DIR}/pulse:${XDG_RUNTIME_DIR}/pulse:ro - hivemind_cli: - container_name: hivemind_cli - hostname: hivemind_cli - restart: unless-stopped - image: docker.io/smartgic/hivemind-cli:alpha@sha256:896cb56b9c5b1a4eaeba0cb7c53ae173a4b0f777163cbd2573e2b183cbf41ceb - pull_policy: always - tty: true - network_mode: host - environment: - TZ: ${TZ} - volumes: - - ${BENEDIKTA_DOCKER_DIR}/hivemind/config:/home/${HIVEMIND_USER}/.config/hivemind:z - - ${BENEDIKTA_DOCKER_DIR}/hivemind/share:/home/${HIVEMIND_USER}/.local/share/hivemind:z - depends_on: - - hivemind_satellite portainer-agent: container_name: portainer_agent image: portainer/agent:latest@sha256:d2e5f753e8c668f7a7916621e64d6535f212b0f6ade5389a6fcc1f6830405ccf @@ -109,6 +37,45 @@ services: restart: unless-stopped volumes: - /var/run/docker.sock:/var/run/docker.sock + + wyoming-microphone: + command: ["--device", "sysdefault", "--debug"] + container_name: wyoming-microphone + devices: + - /dev/snd:/dev/snd + group_add: + - audio + image: rhasspy/wyoming-mic-external + ports: + - 10600:10600 + restart: unless-stopped + wyoming-playback: + command: ["--device", "sysdefault", "--debug"] + container_name: wyoming-playback + devices: + - /dev/snd:/dev/snd + group_add: + - audio + image: rhasspy/wyoming-snd-external + ports: + - 10601:10601 + restart: unless-stopped + wyoming-satellite: + command: + [ + "--name", + "benedikta", + "--mic-uri", + "tcp://wyoming-microphone:10600", + "--snd-uri", + "tcp://wyoming-playback:10601", + "--debug", + ] + container_name: wyoming-satellite + image: rhasspy/wyoming-satellite + ports: + - 10700:10700 + restart: unless-stopped volumes: beszel-agent-data: name: beszel-agent-data -- 2.52.0 From fc35ea3f7c4ea9d53da3f0b5524a219bdfa6e207 Mon Sep 17 00:00:00 2001 From: "Trez.One" Date: Wed, 10 Dec 2025 09:14:41 -0500 Subject: [PATCH 2/6] Removing OVOS and adding Wyoming containers. --- docker-compose.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 4bc0004..9f2537e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -37,7 +37,6 @@ services: restart: unless-stopped volumes: - /var/run/docker.sock:/var/run/docker.sock - wyoming-microphone: command: ["--device", "sysdefault", "--debug"] container_name: wyoming-microphone -- 2.52.0 From ce1fa32ab93f679db0ca559ac6871fd441cf1ef0 Mon Sep 17 00:00:00 2001 From: "Trez.One" Date: Wed, 10 Dec 2025 09:14:55 -0500 Subject: [PATCH 3/6] Slimming workflows. --- .gitea/workflows/pr-docker-deploy.yml | 58 ++++------------ .gitea/workflows/renovate-pr-deploy.yml | 92 +++++++------------------ 2 files changed, 37 insertions(+), 113 deletions(-) diff --git a/.gitea/workflows/pr-docker-deploy.yml b/.gitea/workflows/pr-docker-deploy.yml index 400c035..3f507bb 100644 --- a/.gitea/workflows/pr-docker-deploy.yml +++ b/.gitea/workflows/pr-docker-deploy.yml @@ -69,64 +69,32 @@ jobs: notification_title: "GITEA: Services TBD" notification_message: "Generating list of services to deploy..." + - name: Save both versions of docker-compose.yml + run: | + git show origin/main:docker-compose.yml > docker-compose-main.yml || touch docker-compose-main.yml + cp docker-compose.yml docker-compose-head.yml + - name: Detect added, deleted, and modified services id: detect_services run: | echo "Getting services from main and ${{ github.ref_name }}" - - # Dynamically find all docker-compose YAML files (root + compose folder) - COMPOSE_FILES=($(find . -maxdepth 2 -type f -name 'docker-compose*.yml' | sort)) - - echo "Found Compose files:" - printf '%s\n' "${COMPOSE_FILES[@]}" - - # Temp files to store all services - touch services_main_all.txt services_head_all.txt - - for f in "${COMPOSE_FILES[@]}"; do - echo "Processing $f" - - # Create a safe filename by replacing slashes with underscores - safe_f=$(echo "$f" | sed 's|[./]|_|g') - - # Fetch main version - git show origin/main:"$f" > "main_${safe_f}" 2>/dev/null || touch "main_${safe_f}" - cp "$f" "head_${safe_f}" - - # Extract services and append to global list - yq '.services | keys | .[]' "main_${safe_f}" >> services_main_all.txt 2>/dev/null || true - yq '.services | keys | .[]' "head_${safe_f}" >> services_head_all.txt 2>/dev/null || true - done - - # Sort and deduplicate - sort -u services_main_all.txt -o services_main_all.txt - sort -u services_head_all.txt -o services_head_all.txt + yq '.services | keys | .[]' docker-compose-main.yml | sort > services_main.txt + yq '.services | keys | .[]' docker-compose-head.yml | sort > services_head.txt echo "Creating list of modified services..." touch service_changes.txt - # Added services - comm -13 services_main_all.txt services_head_all.txt | while read service; do + comm -13 services_main.txt services_head.txt | while read service; do echo "$service: added" >> service_changes.txt done - # Modified services (parallelized) - comm -12 services_main_all.txt services_head_all.txt | xargs -n1 -P4 -I{} bash -c ' - service="{}" - modified=0 - for f in "${COMPOSE_FILES[@]}"; do - safe_f=$(echo "$f" | sed "s|[./]|_|g") - yq ".services[\"$service\"]" "main_${safe_f}" > tmp_main.yml 2>/dev/null || continue - yq ".services[\"$service\"]" "head_${safe_f}" > tmp_head.yml 2>/dev/null || continue - if ! diff -q tmp_main.yml tmp_head.yml > /dev/null; then - modified=1 - break - fi - done - if [[ $modified -eq 1 ]]; then + comm -12 services_main.txt services_head.txt | while read service; do + yq ".services[\"$service\"]" docker-compose-main.yml > tmp_main.yml + yq ".services[\"$service\"]" docker-compose-head.yml > tmp_head.yml + if ! diff -q tmp_main.yml tmp_head.yml > /dev/null; then echo "$service: modified" >> service_changes.txt fi - ' + done echo "Detected service changes:" cat service_changes.txt diff --git a/.gitea/workflows/renovate-pr-deploy.yml b/.gitea/workflows/renovate-pr-deploy.yml index dbc4ce8..e39bd01 100644 --- a/.gitea/workflows/renovate-pr-deploy.yml +++ b/.gitea/workflows/renovate-pr-deploy.yml @@ -27,91 +27,47 @@ jobs: with: fetch-depth: 0 - - name: Get changed services from all Compose files. - id: services + - name: Save docker-compose.yml after merge (new) run: | - echo "Getting services from main and ${{ github.ref_name }}" + git show origin/main:docker-compose.yml > docker-compose-new.yml - # Dynamically find all docker-compose YAML files (root + compose folder) - COMPOSE_FILES=($(find . -type f -name 'docker-compose*.yml' | sort)) + - name: Detect services with image tag/digest changes + id: detect_services + run: | + set -euo pipefail - echo "Found Compose files:" - printf '%s\n' "${COMPOSE_FILES[@]}" + echo "Flattening docker-compose files..." + yq eval '... comments=""' docker-compose-old.yml > docker-compose-old-flat.yml + yq eval '... comments=""' docker-compose-new.yml > docker-compose-new-flat.yml - # Temp files to store all services - touch services_main_all.txt services_head_all.txt + echo "Getting service names..." + yq eval '.services | keys | .[]' docker-compose-old-flat.yml | sort > services_old.txt + yq eval '.services | keys | .[]' docker-compose-new-flat.yml | sort > services_new.txt - for f in "${COMPOSE_FILES[@]}"; do - echo "Processing $f" + echo "Checking for image changes..." + : > service_changes.txt - # Create a safe filename by replacing slashes with underscores - safe_f=$(echo "$f" | sed 's|[./]|_|g') + comm -12 services_old.txt services_new.txt | while read service; do + old_image=$(yq eval-all --yaml-fix-merge-anchor-to-spec=true ".services[\"$service\"].image // \"\"" docker-compose-old-flat.yml) + new_image=$(yq eval-all --yaml-fix-merge-anchor-to-spec=true ".services[\"$service\"].image // \"\"" docker-compose-new-flat.yml) - # Fetch main version - git show origin/main:"$f" > "main_${safe_f}" 2>/dev/null || touch "main_${safe_f}" - cp "$f" "head_${safe_f}" - - # Extract services and append to global list - yq '.services | keys | .[]' "main_${safe_f}" >> services_main_all.txt 2>/dev/null || true - yq '.services | keys | .[]' "head_${safe_f}" >> services_head_all.txt 2>/dev/null || true - done - - # Sort and deduplicate - sort -u services_main_all.txt -o services_main_all.txt - sort -u services_head_all.txt -o services_head_all.txt - - echo "Creating list of modified services..." - touch service_changes.txt - - # Added services - comm -13 services_main_all.txt services_head_all.txt | while read service; do - echo "$service: added" >> service_changes.txt - done - - # Modified services (parallelized) - comm -12 services_main_all.txt services_head_all.txt | xargs -n1 -P4 -I{} bash -c ' - service="{}" - modified=0 - for f in "${COMPOSE_FILES[@]}"; do - safe_f=$(echo "$f" | sed "s|[./]|_|g") - yq ".services[\"$service\"]" "main_${safe_f}" > tmp_main.yml 2>/dev/null || continue - yq ".services[\"$service\"]" "head_${safe_f}" > tmp_head.yml 2>/dev/null || continue - if ! diff -q tmp_main.yml tmp_head.yml > /dev/null; then - modified=1 - break - fi - done - if [[ $modified -eq 1 ]]; then - echo "$service: modified" >> service_changes.txt + if [ "$old_image" != "$new_image" ]; then + echo "$service" >> service_changes.txt fi - ' + done - echo "Detected service changes:" - cat service_changes.txt + echo "Detected services with changed images:" + cat service_changes.txt || true - mod_svcs=$(cut -d':' -f1 service_changes.txt | sort | uniq | tr '\n' ' ' | sed 's/ *$//') + # Prepare multiline output for GitHub Actions echo "docker_svc_list<> "$GITHUB_OUTPUT" - echo "$mod_svcs" >> "$GITHUB_OUTPUT" + sort -u service_changes.txt >> "$GITHUB_OUTPUT" echo "EOF" >> "$GITHUB_OUTPUT" - name: List of Services for (Re)Deployment run: | echo -e "${{ steps.services.outputs.docker_svc_list }}" - - name: Get list of Compose files - id: compose_file_list - run: | - compose_list=$(find . -type f -name "docker-compose*.yml" \ - -a ! -name "*windows*" \ - -a ! -name "*gui*" \ - -a ! -name "*macos*" \ - -a ! -name "*hivemind*" \ - -a ! -name "*server*" \ - | sed -e ':a;N;$!ba;s/[\r\n]/ /g') - - echo "compose_list=$compose_list" >> "$GITHUB_OUTPUT" - echo "Compose files: $compose_list" - - name: Login to Docker Hub uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 env: -- 2.52.0 From eb013b66c6cc302c0f47997e0fd94372102889ff Mon Sep 17 00:00:00 2001 From: "Trez.One" Date: Wed, 10 Dec 2025 09:15:09 -0500 Subject: [PATCH 4/6] Removing OVOS. --- .gitmodules | 4 ---- ovos-compose | 1 - 2 files changed, 5 deletions(-) delete mode 100644 .gitmodules delete mode 160000 ovos-compose diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 29d84dd..0000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "ovos-compose"] - path = ovos-compose - url = https://github.com/OpenVoiceOS/ovos-docker.git - branch = dev diff --git a/ovos-compose b/ovos-compose deleted file mode 160000 index b88310b..0000000 --- a/ovos-compose +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b88310b76157feb538a7bace01aa677fab2269ca -- 2.52.0 From b24ad4351d091931316a7ebf0ad64954cc87f4db Mon Sep 17 00:00:00 2001 From: "Trez.One" Date: Wed, 10 Dec 2025 09:18:33 -0500 Subject: [PATCH 5/6] ... --- .gitea/workflows/pr-docker-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/pr-docker-deploy.yml b/.gitea/workflows/pr-docker-deploy.yml index 3f507bb..58588c4 100644 --- a/.gitea/workflows/pr-docker-deploy.yml +++ b/.gitea/workflows/pr-docker-deploy.yml @@ -6,7 +6,7 @@ on: branches-ignore: - "main" paths: - - "**/docker-compose*.yml" + - "**/docker-compose.yml" env: HC_VAULT_VERSION: "1.21.1" -- 2.52.0 From 9127ae7f2989bc7abac6d87799ad761f212400c6 Mon Sep 17 00:00:00 2001 From: "Trez.One" Date: Wed, 10 Dec 2025 09:48:37 -0500 Subject: [PATCH 6/6] ... --- .gitea/workflows/pr-docker-deploy.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitea/workflows/pr-docker-deploy.yml b/.gitea/workflows/pr-docker-deploy.yml index 58588c4..5c2e254 100644 --- a/.gitea/workflows/pr-docker-deploy.yml +++ b/.gitea/workflows/pr-docker-deploy.yml @@ -193,9 +193,6 @@ jobs: ssh_key: ${{ secrets.RUNNER_SSH_PRIVATE_KEY }} args: --remove-orphans --dry-run ${{ needs.generate-service-list.outputs.svc_deploy_list }} env_file: ".env" - registry_host: "docker.io" - registry_user: ${{ secrets.DOCKERHUB_USER }} - registry_pass: ${{ secrets.DOCKERHUB_PASSWORD }} summary: true - name: Gotify Notification -- 2.52.0