diff --git a/compose/.env-raspberrypi b/compose/.env-raspberrypi new file mode 100644 index 0000000..628d2a6 --- /dev/null +++ b/compose/.env-raspberrypi @@ -0,0 +1,53 @@ +# OpenVoiceOS Docker Compose Environment Configuration for Raspberry Pi +# Optimized for Raspberry Pi hardware with Docker best practices + +# User and Group Configuration (defined first to avoid circular references) +OVOS_USER=ovos +HIVEMIND_USER=hivemind + +# Display and Graphics Configuration +DISPLAY=:0 +WAYLAND_DISPLAY=wayland-0 +XDG_RUNTIME_DIR=/run/user/1000 + +# Qt/GUI Configuration for Raspberry Pi +QT_QPA_PLATFORM=eglfs +QT_QPA_EGLFS_INTEGRATION=eglfs_kms +QT_QPA_EGLFS_KMS_CONFIG=/home/ovos/.config/mycroft/ovos-eglfs.json + +# Raspberry Pi specific Group IDs +GPIO_GID=997 +I2C_GID=994 +INPUT_GID=102 +RENDER_GID=106 +SPI_GID=995 +VIDEO_GID=44 + +# Directory Configuration +OVOS_CONFIG_FOLDER=/home/ovos/ovos/config +OVOS_CONFIG_PHAL_FOLDER=/home/ovos/ovos/config/phal +OVOS_PERSONA_FOLDER=/home/ovos/ovos/config/persona +OVOS_SHARE_FOLDER=/home/ovos/ovos/share +TMP_FOLDER=/home/ovos/ovos/tmp + +HIVEMIND_CONFIG_FOLDER=/home/hivemind/hivemind/config +HIVEMIND_CONFIG_PHAL_FOLDER=/home/hivemind/hivemind/config/phal +HIVEMIND_SHARE_FOLDER=/home/hivemind/hivemind/share + +# Docker Configuration +VERSION=alpha +PULL_POLICY=always + +# Audio Configuration (Raspberry Pi specific) +PULSE_SERVER=unix:/run/user/1000/pulse/native +PULSE_COOKIE=/home/ovos/.config/pulse/cookie + +# Timezone Configuration +TZ=America/Montreal + +# Resource Management (Raspberry Pi optimized) +# These can be overridden in compose files for specific services +DEFAULT_MEMORY_LIMIT=256M +DEFAULT_MEMORY_RESERVATION=64M +CORE_MEMORY_LIMIT=512M +CORE_MEMORY_RESERVATION=128M diff --git a/compose/.env.example b/compose/.env.example new file mode 100644 index 0000000..25e2816 --- /dev/null +++ b/compose/.env.example @@ -0,0 +1,120 @@ +# OpenVoiceOS Docker Compose Environment Configuration +# Optimized version with improved defaults and documentation +# Copy this file to .env and modify the values as needed + +# ============================================================================= +# USER AND GROUP CONFIGURATION +# ============================================================================= +# Primary users (defined first to avoid circular references) +OVOS_USER=ovos +HIVEMIND_USER=hivemind + +# ============================================================================= +# DISPLAY AND GRAPHICS CONFIGURATION +# ============================================================================= +# X11 Display configuration +DISPLAY=:0 +WAYLAND_DISPLAY=wayland-0 +XDG_RUNTIME_DIR=/run/user/1000 + +# Qt/GUI Configuration +QT_QPA_PLATFORM=eglfs +QT_QPA_EGLFS_INTEGRATION=eglfs_kms +QT_QPA_EGLFS_KMS_CONFIG=/home/ovos/.config/mycroft/ovos-eglfs.json + +# ============================================================================= +# SYSTEM GROUP CONFIGURATION +# ============================================================================= + +# System Group IDs (adjust based on your system) +# Use: getent group | cut -d: -f3 +INPUT_GID=102 +RENDER_GID=106 +VIDEO_GID=44 + +# Raspberry Pi specific Group IDs (only used on Pi) +GPIO_GID=997 +I2C_GID=994 +SPI_GID=995 + +# ============================================================================= +# DIRECTORY CONFIGURATION +# ============================================================================= +# OVOS directories +OVOS_CONFIG_FOLDER=/home/ovos/ovos/config +OVOS_CONFIG_PHAL_FOLDER=/home/ovos/ovos/config/phal +OVOS_PERSONA_FOLDER=/home/ovos/ovos/config/persona +OVOS_SHARE_FOLDER=/home/ovos/ovos/share +TMP_FOLDER=/home/ovos/ovos/tmp + +# Hivemind directories +HIVEMIND_CONFIG_FOLDER=/home/hivemind/hivemind/config +HIVEMIND_CONFIG_PHAL_FOLDER=/home/hivemind/hivemind/config/phal +HIVEMIND_SHARE_FOLDER=/home/hivemind/hivemind/share + +# ============================================================================= +# DOCKER CONFIGURATION +# ============================================================================= +# Image version and pull policy +VERSION=alpha +PULL_POLICY=always + +# ============================================================================= +# SYSTEM CONFIGURATION +# ============================================================================= +# Timezone configuration +TZ=UTC + +# ============================================================================= +# PLATFORM-SPECIFIC OVERRIDES +# ============================================================================= +# Uncomment and modify based on your platform: + +# For macOS: +# PULSE_SERVER=docker.for.mac.host.internal + +# For Windows WSL: +# PULSE_SERVER=/mnt/wslg/PulseServer +# XDG_RUNTIME_DIR=/mnt/wslg + +# For standard Linux: +# PULSE_SERVER=unix:/run/user/1000/pulse/native + +# ============================================================================= +# RESOURCE LIMITS (Optional - uncomment to override defaults) +# ============================================================================= +# Memory limits for different service types +# CORE_MEMORY_LIMIT=1G +# STANDARD_MEMORY_LIMIT=512M +# LIGHT_MEMORY_LIMIT=256M + +# CPU limits +# CORE_CPU_LIMIT=1.0 +# STANDARD_CPU_LIMIT=0.5 + +# ============================================================================= +# ADVANCED CONFIGURATION +# ============================================================================= +# Health check intervals (uncomment to override defaults) +# HEALTH_CHECK_INTERVAL=30s +# HEALTH_CHECK_TIMEOUT=10s +# HEALTH_CHECK_RETRIES=3 + +# Logging configuration +# LOG_MAX_SIZE=200m +# LOG_MAX_FILES=1 + +# ============================================================================= +# SECURITY CONFIGURATION +# ============================================================================= +# Set to 'true' to enable additional security features +# ENABLE_APPARMOR=false +# ENABLE_SECCOMP=false + +# ============================================================================= +# DEVELOPMENT CONFIGURATION +# ============================================================================= +# Development mode settings (uncomment for development) +# DEV_MODE=false +# DEBUG_LOGGING=false +# ENABLE_PROFILING=false diff --git a/compose/docker-compose.gui.yml b/compose/docker-compose.gui.yml new file mode 100644 index 0000000..2e95660 --- /dev/null +++ b/compose/docker-compose.gui.yml @@ -0,0 +1,211 @@ +--- +x-podman: &podman + userns_mode: keep-id + security_opt: + - "label=disable" + +x-logging: &default-logging + driver: json-file + options: + mode: non-blocking + max-buffer-size: 4m + max-size: "200m" + max-file: "1" + +x-common-environment: &common-environment + TZ: ${TZ:-UTC} + +x-gui-environment: &gui-environment + <<: *common-environment + DBUS_SESSION_BUS_ADDRESS: unix:path=${XDG_RUNTIME_DIR}/bus + DISPLAY: ${DISPLAY} + PULSE_SERVER: unix:${XDG_RUNTIME_DIR}/pulse/native + PULSE_COOKIE: /home/${OVOS_USER}/.config/pulse/cookie + QML2_IMPORT_PATH: /usr/lib/qml + QT_QPA_PLATFORM: ${QT_QPA_PLATFORM} + QT_QPA_EGLFS_HIDECURSOR: 1 + QT_QPA_EGLFS_KMS_ATOMIC: 1 + QT_QPA_EGLFS_INTEGRATION: ${QT_QPA_EGLFS_INTEGRATION} + QT_QPA_EGLFS_KMS_CONFIG: ${QT_QPA_EGLFS_KMS_CONFIG} + QT_QPA_PLATFORMTHEME: qt5ct + QT_PLUGIN_PATH: /usr/lib/qt/plugins:/usr/lib/plugins:/usr/lib/plugins/kf5 + QT_FILE_SELECTORS: ovos + QT_FONT_DPI: 120 + QT_IM_MODULE: qtvirtualkeyboard + QT_QUICK_CONTROLS_STYLE: OpenVoiceStyle + WAYLAND_DISPLAY: ${WAYLAND_DISPLAY} + XDG_CURRENT_DESKTOP: kde + XDG_RUNTIME_DIR: ${XDG_RUNTIME_DIR} + +x-resource-limits: &resource-limits + deploy: + resources: + limits: + memory: 512M + reservations: + memory: 128M + +x-gui-resource-limits: &gui-resource-limits + deploy: + resources: + limits: + memory: 1G + cpus: "1.0" + reservations: + memory: 256M + cpus: "0.25" + +x-skill-resource-limits: &skill-resource-limits + deploy: + resources: + limits: + memory: 256M + reservations: + memory: 64M + +volumes: + ovos_gui_files: + name: ovos_gui_files + driver: local + +services: + ovos_gui_websocket: + <<: [*podman, *resource-limits] + container_name: ovos_gui_websocket + hostname: ovos_gui_websocket + restart: unless-stopped + image: docker.io/smartgic/ovos-gui-websocket:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *common-environment + network_mode: host + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft:ro + - ovos_gui_files:/home/${OVOS_USER}/.cache/ovos_gui_file_server + - ${TMP_FOLDER}:/tmp/mycroft + depends_on: + ovos_messagebus: + condition: service_started + healthcheck: + test: ["CMD", "pgrep", "-f", "ovos-gui-service"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 15s + + ovos_gui: + <<: [*podman, *gui-resource-limits] + container_name: ovos_gui + hostname: ovos_gui + restart: unless-stopped + image: docker.io/smartgic/ovos-gui-shell:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *gui-environment + network_mode: host + devices: + - /dev/input + - /dev/dri + - /dev/snd + group_add: + - ${INPUT_GID} + - ${RENDER_GID} + - ${VIDEO_GID} + volumes: + - ~/.config/pulse/cookie:/home/${OVOS_USER}/.config/pulse/cookie:ro + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft:ro + - ${TMP_FOLDER}:/tmp/mycroft + - ${XDG_RUNTIME_DIR}:${XDG_RUNTIME_DIR}:ro + - ${XDG_RUNTIME_DIR}/bus:${XDG_RUNTIME_DIR}/bus:ro + - ${XDG_RUNTIME_DIR}/pipewire-0:${XDG_RUNTIME_DIR}/pipewire-0:ro + - ${XDG_RUNTIME_DIR}/pulse:${XDG_RUNTIME_DIR}/pulse:ro + - ${OVOS_SHARE_FOLDER}:/home/${OVOS_USER}/.local/share/mycroft + - ovos_gui_files:/home/${OVOS_USER}/.cache/gui_files + - /run/udev/data:/run/udev/data:ro + depends_on: + ovos_messagebus: + condition: service_started + # ovos_gui_websocket: + # condition: service_started + ovos_phal: + condition: service_started + healthcheck: + test: ["CMD", "pgrep", "-f", "ovos-shell"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s + + ######################## + # Uncomment this service if you want to use the original GUI + # without the Open Voice OS Shell layer + ######################## + # ovos_gui_original: + # <<: [*podman, *gui-resource-limits] + # container_name: ovos_gui_original + # hostname: ovos_gui_original + # restart: unless-stopped + # image: docker.io/smartgic/ovos-gui-original:${VERSION} + # logging: *default-logging + # pull_policy: ${PULL_POLICY:-always} + # environment: + # <<: *gui-environment + # DISPLAY: :0 + # network_mode: host + # devices: + # - /dev/input + # - /dev/dri + # - /dev/snd + # group_add: + # - ${INPUT_GID} + # - ${RENDER_GID} + # - ${VIDEO_GID} + # volumes: + # - ~/.config/pulse/cookie:/home/${OVOS_USER}/.config/pulse/cookie:ro + # - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft:ro + # - ${TMP_FOLDER}:/tmp/mycroft + # - ${XDG_RUNTIME_DIR}:${XDG_RUNTIME_DIR}:ro + # - ${XDG_RUNTIME_DIR}/bus:${XDG_RUNTIME_DIR}/bus:ro + # - ${XDG_RUNTIME_DIR}/pipewire-0:${XDG_RUNTIME_DIR}/pipewire-0:ro + # - ${XDG_RUNTIME_DIR}/pulse:${XDG_RUNTIME_DIR}/pulse:ro + # - ${OVOS_SHARE_FOLDER}:/home/${OVOS_USER}/.local/share/mycroft + # - /run/udev/data:/run/udev/data:ro + # depends_on: + # ovos_messagebus: + # condition: service_started + # ovos_gui_websocket: + # condition: service_started + # ovos_phal: + # condition: service_started + # healthcheck: + # test: ["CMD", "pgrep", "-f", "ovos-gui"] + # interval: 30s + # timeout: 10s + # retries: 3 + # start_period: 30s + + ovos_skill_homescreen: + <<: [*podman, *skill-resource-limits] + container_name: ovos_skill_homescreen + hostname: ovos_skill_homescreen + restart: unless-stopped + image: docker.io/smartgic/ovos-skill-homescreen:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *common-environment + network_mode: host + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + depends_on: + ovos_core: + condition: service_started + healthcheck: + test: ["CMD", "pgrep", "-f", "skill-ovos-homescreen"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 15s diff --git a/compose/docker-compose.hivemind.yml b/compose/docker-compose.hivemind.yml new file mode 100644 index 0000000..d156f23 --- /dev/null +++ b/compose/docker-compose.hivemind.yml @@ -0,0 +1,63 @@ +--- +x-podman: &podman + userns_mode: keep-id + security_opt: + - "label=disable" + +x-logging: &default-logging + driver: json-file + options: + mode: non-blocking + max-buffer-size: 4m + max-size: "200m" + max-file: "1" + +x-common-environment: &common-environment + TZ: ${TZ:-UTC} + +x-light-resource-limits: &light-resource-limits + deploy: + resources: + limits: + memory: 256M + reservations: + memory: 64M + +x-hivemind-base: &hivemind-base + <<: [*podman, *light-resource-limits] + restart: unless-stopped + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + tty: true + environment: + <<: *common-environment + network_mode: host + volumes: + - ${HIVEMIND_CONFIG_FOLDER}:/home/${HIVEMIND_USER}/.config/hivemind:z + - ${HIVEMIND_SHARE_FOLDER}:/home/${HIVEMIND_USER}/.local/share/hivemind:z + healthcheck: + interval: 30s + timeout: 10s + retries: 3 + start_period: 15s + +services: + hivemind_listener: + <<: *hivemind-base + container_name: hivemind_listener + hostname: hivemind_listener + image: docker.io/smartgic/hivemind-listener:${VERSION} + depends_on: + ovos_core: + condition: service_started + healthcheck: + test: ["CMD", "pgrep", "-f", "hivemind-listener"] + + hivemind_cli: + <<: *hivemind-base + container_name: hivemind_cli + hostname: hivemind_cli + image: docker.io/smartgic/hivemind-cli:${VERSION} + depends_on: + hivemind_listener: + condition: service_started diff --git a/compose/docker-compose.macos.yml b/compose/docker-compose.macos.yml new file mode 100644 index 0000000..2fe6004 --- /dev/null +++ b/compose/docker-compose.macos.yml @@ -0,0 +1,237 @@ +--- +x-podman: &podman + userns_mode: keep-id + security_opt: + - "label=disable" + +x-logging: &default-logging + driver: json-file + options: + mode: non-blocking + max-buffer-size: 4m + max-size: "200m" + max-file: "1" + +x-common-environment: &common-environment + TZ: ${TZ:-UTC} + +x-audio-environment: &audio-environment + <<: *common-environment + PULSE_SERVER: ${PULSE_SERVER:-docker.for.mac.host.internal} + PULSE_COOKIE: /home/${OVOS_USER}/.config/pulse/cookie + +x-resource-limits: &resource-limits + deploy: + resources: + limits: + memory: 512M + reservations: + memory: 128M + +x-core-resource-limits: &core-resource-limits + deploy: + resources: + limits: + memory: 1G + cpus: "1.0" + reservations: + memory: 256M + cpus: "0.25" + +volumes: + ovos_models: + name: ovos_models + driver: local + ovos_vosk: + name: ovos_vosk + driver: local + ovos_listener_records: + name: ovos_listener_records + driver: local + ovos_tts_cache: + name: ovos_tts_cache + driver: local + ovos_nltk: + name: ovos_nltk + driver: local + ovos_local_state: + name: ovos_local_state + driver: local + +services: + ovos_messagebus: + <<: [*podman, *resource-limits] + container_name: ovos_messagebus + hostname: ovos_messagebus + restart: unless-stopped + image: docker.io/smartgic/ovos-messagebus:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *common-environment + network_mode: host + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft:ro + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + + ovos_phal: + <<: [*podman, *resource-limits] + container_name: ovos_phal + hostname: ovos_phal + restart: unless-stopped + image: docker.io/smartgic/ovos-phal:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *audio-environment + network_mode: host + privileged: true + volumes: + - ~/.config/pulse/cookie:/home/${OVOS_USER}/.config/pulse/cookie:ro + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + depends_on: + ovos_messagebus: + condition: service_started + + ovos_phal_admin: + <<: [*podman, *resource-limits] + container_name: ovos_phal_admin + hostname: ovos_phal_admin + restart: unless-stopped + image: docker.io/smartgic/ovos-phal-admin:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *common-environment + network_mode: host + privileged: true + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + - /dev:/dev:ro + depends_on: + ovos_messagebus: + condition: service_started + + ovos_listener: + <<: [*podman, *resource-limits] + container_name: ovos_listener + hostname: ovos_listener + restart: unless-stopped + image: docker.io/smartgic/ovos-listener:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *audio-environment + network_mode: host + volumes: + - ~/.config/pulse/cookie:/home/${OVOS_USER}/.config/pulse/cookie:ro + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft:ro + - ovos_listener_records:/home/${OVOS_USER}/.local/share/mycroft/listener + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ovos_models:/home/${OVOS_USER}/.local/share/precise-lite + - ovos_vosk:/home/${OVOS_USER}/.local/share/vosk + - ${TMP_FOLDER}:/tmp/mycroft + depends_on: + ovos_messagebus: + condition: service_started + ovos_phal: + condition: service_started + + ovos_plugin_ggwave: + <<: [*podman, *resource-limits] + container_name: ovos_plugin_ggwave + hostname: ovos_plugin_ggwave + restart: unless-stopped + image: docker.io/smartgic/ovos-plugin-ggwave:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *audio-environment + network_mode: host + volumes: + - ~/.config/pulse/cookie:/home/${OVOS_USER}/.config/pulse/cookie:ro + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft:ro + - ${TMP_FOLDER}:/tmp/mycroft + depends_on: + ovos_messagebus: + condition: service_started + ovos_phal: + condition: service_started + healthcheck: + test: ["CMD", "pgrep", "-f", "ggwave"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 15s + + ovos_audio: + <<: [*podman, *resource-limits] + container_name: ovos_audio + hostname: ovos_audio + restart: unless-stopped + image: docker.io/smartgic/ovos-audio:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *audio-environment + network_mode: host + volumes: + - ~/.config/pulse/cookie:/home/${OVOS_USER}/.config/pulse/cookie:ro + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ovos_tts_cache:/home/${OVOS_USER}/.cache/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + depends_on: + ovos_messagebus: + condition: service_started + ovos_phal: + condition: service_started + + ovos_core: + <<: [*podman, *core-resource-limits] + container_name: ovos_core + hostname: ovos_core + restart: unless-stopped + image: docker.io/smartgic/ovos-core:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *audio-environment + network_mode: host + volumes: + - ~/.config/pulse/cookie:/home/${OVOS_USER}/.config/pulse/cookie:ro + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ${OVOS_PERSONA_FOLDER}:/home/${OVOS_USER}/.config/ovos_persona + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ovos_nltk:/home/${OVOS_USER}/nltk_data + - ${OVOS_SHARE_FOLDER}:/home/${OVOS_USER}/.local/share/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + depends_on: + ovos_messagebus: + condition: service_started + ovos_phal: + condition: service_started + + ovos_cli: + <<: [*podman, *resource-limits] + container_name: ovos_cli + hostname: ovos_cli + restart: unless-stopped + image: docker.io/smartgic/ovos-cli:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *common-environment + network_mode: host + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + depends_on: + ovos_messagebus: + condition: service_started diff --git a/compose/docker-compose.raspberrypi.gui.yml b/compose/docker-compose.raspberrypi.gui.yml new file mode 100644 index 0000000..4e4f511 --- /dev/null +++ b/compose/docker-compose.raspberrypi.gui.yml @@ -0,0 +1,15 @@ +--- +services: + ovos_gui: + healthcheck: + disable: true + devices: + - /dev/vchiq + + ovos_gui_websocket: + healthcheck: + disable: true + + ovos_skill_homescreen: + healthcheck: + disable: true diff --git a/compose/docker-compose.raspberrypi.yml b/compose/docker-compose.raspberrypi.yml new file mode 100644 index 0000000..e791894 --- /dev/null +++ b/compose/docker-compose.raspberrypi.yml @@ -0,0 +1,81 @@ +--- +# Raspberry Pi specific overrides with optimized resource limits for ARM hardware + +x-pi-resource-limits: &pi-resource-limits + deploy: + resources: + limits: + memory: 256M + reservations: + memory: 64M + +x-pi-core-resource-limits: &pi-core-resource-limits + deploy: + resources: + limits: + memory: 512M + cpus: "0.8" + reservations: + memory: 128M + cpus: "0.2" + +x-pi-light-resource-limits: &pi-light-resource-limits + deploy: + resources: + limits: + memory: 128M + reservations: + memory: 32M + +services: + ovos_messagebus: + <<: *pi-resource-limits + healthcheck: + disable: true + + ovos_phal: + <<: *pi-resource-limits + healthcheck: + disable: true + group_add: + - "${GPIO_GID}" + - "${I2C_GID}" + - "${SPI_GID}" + + ovos_phal_admin: + <<: *pi-light-resource-limits + healthcheck: + disable: true + group_add: + - "${GPIO_GID}" + - "${I2C_GID}" + - "${SPI_GID}" + + ovos_listener: + <<: *pi-resource-limits + healthcheck: + disable: true + + ovos_plugin_ggwave: + <<: *pi-resource-limits + healthcheck: + disable: true + + ovos_audio: + <<: *pi-resource-limits + healthcheck: + disable: true + + ovos_core: + <<: *pi-core-resource-limits + healthcheck: + disable: true + group_add: + - "${GPIO_GID}" + - "${I2C_GID}" + - "${SPI_GID}" + + ovos_cli: + <<: *pi-light-resource-limits + healthcheck: + disable: true diff --git a/compose/docker-compose.server.yml b/compose/docker-compose.server.yml new file mode 100644 index 0000000..21544a0 --- /dev/null +++ b/compose/docker-compose.server.yml @@ -0,0 +1,151 @@ +--- +x-podman: &podman + userns_mode: keep-id + security_opt: + - "label=disable" + +x-logging: &default-logging + driver: json-file + options: + mode: non-blocking + max-buffer-size: 4m + max-size: "200m" + max-file: "1" + +x-common-environment: &common-environment + TZ: ${TZ:-UTC} + +x-resource-limits: &resource-limits + deploy: + resources: + limits: + memory: 512M + reservations: + memory: 128M + +x-core-resource-limits: &core-resource-limits + deploy: + resources: + limits: + memory: 1G + cpus: "1.0" + reservations: + memory: 256M + cpus: "0.25" + +x-light-resource-limits: &light-resource-limits + deploy: + resources: + limits: + memory: 256M + reservations: + memory: 64M + +volumes: + ovos_nltk: + name: ovos_nltk + driver: local + ovos_local_state: + name: ovos_local_state + driver: local + +services: + ovos_messagebus: + <<: [*podman, *resource-limits] + container_name: ovos_messagebus + hostname: ovos_messagebus + restart: unless-stopped + image: docker.io/smartgic/ovos-messagebus:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *common-environment + network_mode: host + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft:ro + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + healthcheck: + test: + [ + "CMD", + "python3", + "-c", + "import socket; s=socket.socket(); s.connect(('localhost', 8181)); s.close()", + ] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s + + ovos_core: + <<: [*podman, *core-resource-limits] + container_name: ovos_core + hostname: ovos_core + restart: unless-stopped + image: docker.io/smartgic/ovos-core:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *common-environment + network_mode: host + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ${OVOS_PERSONA_FOLDER}:/home/${OVOS_USER}/.config/ovos_persona + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ovos_nltk:/home/${OVOS_USER}/nltk_data + - ${OVOS_SHARE_FOLDER}:/home/${OVOS_USER}/.local/share/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + depends_on: + ovos_messagebus: + condition: service_started + healthcheck: + test: ["CMD", "pgrep", "-f", "ovos-core"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s + + hivemind_listener: + <<: [*podman, *light-resource-limits] + container_name: hivemind_listener + hostname: hivemind_listener + restart: unless-stopped + image: docker.io/smartgic/hivemind-listener:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + tty: true + environment: + <<: *common-environment + network_mode: host + volumes: + - ${HIVEMIND_CONFIG_FOLDER}:/home/${HIVEMIND_USER}/.config/hivemind:z + - ${HIVEMIND_SHARE_FOLDER}:/home/${HIVEMIND_USER}/.local/share/hivemind:z + depends_on: + ovos_core: + condition: service_started + healthcheck: + test: ["CMD", "pgrep", "-f", "hivemind-listener"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 15s + + hivemind_cli: + <<: [*podman, *light-resource-limits] + container_name: hivemind_cli + hostname: hivemind_cli + restart: unless-stopped + image: docker.io/smartgic/hivemind-cli:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + tty: true + environment: + <<: *common-environment + network_mode: host + volumes: + - ${HIVEMIND_CONFIG_FOLDER}:/home/${HIVEMIND_USER}/.config/hivemind:z + - ${HIVEMIND_SHARE_FOLDER}:/home/${HIVEMIND_USER}/.local/share/hivemind:z + depends_on: + hivemind_listener: + condition: service_started diff --git a/compose/docker-compose.skills-extra.yml b/compose/docker-compose.skills-extra.yml new file mode 100644 index 0000000..ccfa967 --- /dev/null +++ b/compose/docker-compose.skills-extra.yml @@ -0,0 +1,87 @@ +--- +x-podman: &podman + userns_mode: keep-id + security_opt: + - "label=disable" + +x-logging: &default-logging + driver: json-file + options: + mode: non-blocking + max-buffer-size: 4m + max-size: "200m" + max-file: "1" + +x-common-environment: &common-environment + TZ: ${TZ:-UTC} + +x-skill-resource-limits: &skill-resource-limits + deploy: + resources: + limits: + memory: 256M + reservations: + memory: 64M + +x-skill-base: &skill-base + <<: [*podman, *skill-resource-limits] + restart: unless-stopped + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *common-environment + network_mode: host + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + depends_on: + ovos_core: + condition: service_started + +volumes: + ovos_nltk: + name: ovos_nltk + driver: local + +services: + ovos_skill_wolfie: + <<: *skill-base + container_name: ovos_skill_wolfie + hostname: ovos_skill_wolfie + image: docker.io/smartgic/ovos-skill-wolfie:${VERSION} + + ovos_skill_jokes: + <<: *skill-base + container_name: ovos_skill_jokes + hostname: ovos_skill_jokes + image: docker.io/smartgic/ovos-skill-jokes:${VERSION} + + ovos_skill_easter_eggs: + <<: *skill-base + container_name: ovos_skill_easter_eggs + hostname: ovos_skill_easter_eggs + image: docker.io/smartgic/ovos-skill-easter-eggs:${VERSION} + + ovos_skill_parrot: + <<: *skill-base + container_name: ovos_skill_parrot + hostname: ovos_skill_parrot + image: docker.io/smartgic/ovos-skill-parrot:${VERSION} + + ovos_skill_randomness: + <<: *skill-base + container_name: ovos_skill_randomness + hostname: ovos_skill_randomness + image: docker.io/smartgic/ovos-skill-randomness:${VERSION} + + ovos_skill_camera: + <<: *skill-base + container_name: ovos_skill_camera + hostname: ovos_skill_camera + image: docker.io/smartgic/ovos-skill-camera:${VERSION} + + ovos_skill_wikihow: + <<: *skill-base + container_name: ovos_skill_wikihow + hostname: ovos_skill_wikihow + image: docker.io/smartgic/ovos-skill-wikihow:${VERSION} diff --git a/compose/docker-compose.skills.yml b/compose/docker-compose.skills.yml new file mode 100644 index 0000000..08aa04d --- /dev/null +++ b/compose/docker-compose.skills.yml @@ -0,0 +1,119 @@ +--- +x-podman: &podman + userns_mode: keep-id + security_opt: + - "label=disable" + +x-logging: &default-logging + driver: json-file + options: + mode: non-blocking + max-buffer-size: 4m + max-size: "200m" + max-file: "1" + +x-common-environment: &common-environment + TZ: ${TZ:-UTC} + +x-skill-resource-limits: &skill-resource-limits + deploy: + resources: + limits: + memory: 256M + reservations: + memory: 64M + +x-skill-base: &skill-base + <<: [*podman, *skill-resource-limits] + restart: unless-stopped + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *common-environment + network_mode: host + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + depends_on: + ovos_core: + condition: service_started + +volumes: + ovos_nltk: + name: ovos_nltk + driver: local + +services: + ovos_skill_wikipedia: + <<: *skill-base + container_name: ovos_skill_wikipedia + hostname: ovos_skill_wikipedia + image: docker.io/smartgic/ovos-skill-wikipedia:${VERSION} + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ovos_nltk:/home/${OVOS_USER}/nltk_data + - ${TMP_FOLDER}:/tmp/mycroft + + ovos_skill_weather: + <<: *skill-base + container_name: ovos_skill_weather + hostname: ovos_skill_weather + image: docker.io/smartgic/ovos-skill-weather:${VERSION} + + ovos_skill_volume: + <<: *skill-base + container_name: ovos_skill_volume + hostname: ovos_skill_volume + image: docker.io/smartgic/ovos-skill-volume:${VERSION} + + ovos_skill_date_time: + <<: *skill-base + container_name: ovos_skill_date_time + hostname: ovos_skill_date_time + image: docker.io/smartgic/ovos-skill-date-time:${VERSION} + + ovos_skill_personal: + <<: *skill-base + container_name: ovos_skill_personal + hostname: ovos_skill_personal + image: docker.io/smartgic/ovos-skill-personal:${VERSION} + + ovos_skill_fallback_unknown: + <<: *skill-base + container_name: ovos_skill_fallback_unknown + hostname: ovos_skill_fallback_unknown + image: docker.io/smartgic/ovos-skill-fallback-unknown:${VERSION} + + ovos_skill_hello_world: + <<: *skill-base + container_name: ovos_skill_hello_world + hostname: ovos_skill_hello_world + image: docker.io/smartgic/ovos-skill-hello-world:${VERSION} + + ovos_skill_alerts: + <<: *skill-base + container_name: ovos_skill_alerts + hostname: ovos_skill_alerts + image: docker.io/smartgic/ovos-skill-alerts:${VERSION} + + ovos_skill_ggwave: + <<: *skill-base + container_name: ovos_skill_ggwave + hostname: ovos_skill_ggwave + image: docker.io/smartgic/ovos-skill-ggwave:${VERSION} + + ovos_skill_duckduckgo: + <<: *skill-base + container_name: ovos_skill_duckduckgo + hostname: ovos_skill_duckduckgo + image: docker.io/smartgic/ovos-skill-duckduckgo:${VERSION} + + ovos_skill_wordnet: + <<: *skill-base + container_name: ovos_skill_wordnet + hostname: ovos_skill_wordnet + image: docker.io/smartgic/ovos-skill-wordnet:${VERSION} + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ovos_nltk:/home/${OVOS_USER}/nltk_data + - ${TMP_FOLDER}:/tmp/mycroft diff --git a/compose/docker-compose.windows.yml b/compose/docker-compose.windows.yml new file mode 100644 index 0000000..0e78749 --- /dev/null +++ b/compose/docker-compose.windows.yml @@ -0,0 +1,239 @@ +--- +x-podman: &podman + userns_mode: keep-id + security_opt: + - "label=disable" + +x-logging: &default-logging + driver: json-file + options: + mode: non-blocking + max-buffer-size: 4m + max-size: "200m" + max-file: "1" + +x-common-environment: &common-environment + TZ: ${TZ:-UTC} + +x-audio-environment: &audio-environment + <<: *common-environment + PULSE_SERVER: ${PULSE_SERVER:-/mnt/wslg/PulseServer} + +x-resource-limits: &resource-limits + deploy: + resources: + limits: + memory: 512M + reservations: + memory: 128M + +x-core-resource-limits: &core-resource-limits + deploy: + resources: + limits: + memory: 1G + cpus: "1.0" + reservations: + memory: 256M + cpus: "0.25" + +volumes: + ovos_models: + name: ovos_models + driver: local + ovos_vosk: + name: ovos_vosk + driver: local + ovos_listener_records: + name: ovos_listener_records + driver: local + ovos_tts_cache: + name: ovos_tts_cache + driver: local + ovos_nltk: + name: ovos_nltk + driver: local + ovos_local_state: + name: ovos_local_state + driver: local + +services: + ovos_messagebus: + <<: [*podman, *resource-limits] + container_name: ovos_messagebus + hostname: ovos_messagebus + restart: unless-stopped + image: docker.io/smartgic/ovos-messagebus:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *common-environment + network_mode: host + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft:ro + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + + ovos_phal: + <<: [*podman, *resource-limits] + container_name: ovos_phal + hostname: ovos_phal + restart: unless-stopped + image: docker.io/smartgic/ovos-phal:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *audio-environment + network_mode: host + privileged: true + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + - /mnt/wslg/:/mnt/wslg/ + depends_on: + ovos_messagebus: + condition: service_started + + ovos_phal_admin: + <<: [*podman, *resource-limits] + container_name: ovos_phal_admin + hostname: ovos_phal_admin + restart: unless-stopped + image: docker.io/smartgic/ovos-phal-admin:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *common-environment + network_mode: host + privileged: true + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + - /sys:/sys:ro + - /dev:/dev:ro + depends_on: + ovos_messagebus: + condition: service_started + + ovos_listener: + <<: [*podman, *resource-limits] + container_name: ovos_listener + hostname: ovos_listener + restart: unless-stopped + image: docker.io/smartgic/ovos-listener:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *audio-environment + network_mode: host + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft:ro + - ovos_listener_records:/home/${OVOS_USER}/.local/share/mycroft/listener + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ovos_models:/home/${OVOS_USER}/.local/share/precise-lite + - ovos_vosk:/home/${OVOS_USER}/.local/share/vosk + - ${TMP_FOLDER}:/tmp/mycroft + - /mnt/wslg/:/mnt/wslg/ + depends_on: + ovos_messagebus: + condition: service_started + ovos_phal: + condition: service_started + + ovos_plugin_ggwave: + <<: [*podman, *resource-limits] + container_name: ovos_plugin_ggwave + hostname: ovos_plugin_ggwave + restart: unless-stopped + image: docker.io/smartgic/ovos-plugin-ggwave:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *audio-environment + network_mode: host + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft:ro + - ${TMP_FOLDER}:/tmp/mycroft + - /mnt/wslg/:/mnt/wslg/ + depends_on: + ovos_messagebus: + condition: service_started + ovos_phal: + condition: service_started + healthcheck: + test: ["CMD", "pgrep", "-f", "ggwave"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 15s + + ovos_audio: + <<: [*podman, *resource-limits] + container_name: ovos_audio + hostname: ovos_audio + restart: unless-stopped + image: docker.io/smartgic/ovos-audio:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *audio-environment + DBUS_SESSION_BUS_ADDRESS: unix:path=${XDG_RUNTIME_DIR}/bus + network_mode: host + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ovos_tts_cache:/home/${OVOS_USER}/.cache/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + - ${XDG_RUNTIME_DIR}/bus:${XDG_RUNTIME_DIR}/bus:ro + - /mnt/wslg/:/mnt/wslg/ + depends_on: + ovos_messagebus: + condition: service_started + ovos_phal: + condition: service_started + + ovos_core: + <<: [*podman, *core-resource-limits] + container_name: ovos_core + hostname: ovos_core + restart: unless-stopped + image: docker.io/smartgic/ovos-core:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *audio-environment + network_mode: host + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ${OVOS_PERSONA_FOLDER}:/home/${OVOS_USER}/.config/ovos_persona + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ovos_nltk:/home/${OVOS_USER}/nltk_data + - ${OVOS_SHARE_FOLDER}:/home/${OVOS_USER}/.local/share/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + - /mnt/wslg/:/mnt/wslg/ + depends_on: + ovos_messagebus: + condition: service_started + ovos_phal: + condition: service_started + + ovos_cli: + <<: [*podman, *resource-limits] + container_name: ovos_cli + hostname: ovos_cli + restart: unless-stopped + image: docker.io/smartgic/ovos-cli:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *common-environment + network_mode: host + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + depends_on: + ovos_messagebus: + condition: service_started diff --git a/compose/docker-compose.yml b/compose/docker-compose.yml new file mode 100644 index 0000000..3cda363 --- /dev/null +++ b/compose/docker-compose.yml @@ -0,0 +1,279 @@ +--- +x-podman: &podman + userns_mode: keep-id + security_opt: + - "label=disable" + +x-logging: &default-logging + driver: json-file + options: + mode: non-blocking + max-buffer-size: 4m + max-size: "200m" + max-file: "1" + +x-common-environment: &common-environment + TZ: ${TZ:-UTC} + +x-audio-environment: &audio-environment + <<: *common-environment + PULSE_SERVER: unix:${XDG_RUNTIME_DIR}/pulse/native + PULSE_COOKIE: /home/${OVOS_USER}/.config/pulse/cookie + XDG_RUNTIME_DIR: ${XDG_RUNTIME_DIR} + +x-resource-limits: &resource-limits + deploy: + resources: + limits: + memory: 512M + reservations: + memory: 128M + +x-core-resource-limits: &core-resource-limits + deploy: + resources: + limits: + memory: 1G + cpus: "1.0" + reservations: + memory: 256M + cpus: "0.25" + +x-skill-resource-limits: &skill-resource-limits + deploy: + resources: + limits: + memory: 256M + reservations: + memory: 64M + +volumes: + ovos_models: + name: ovos_models + driver: local + ovos_vosk: + name: ovos_vosk + driver: local + ovos_listener_records: + name: ovos_listener_records + driver: local + ovos_tts_cache: + name: ovos_tts_cache + driver: local + ovos_nltk: + name: ovos_nltk + driver: local + ovos_local_state: + name: ovos_local_state + driver: local + +services: + ovos_messagebus: + <<: [*podman, *resource-limits] + container_name: ovos_messagebus + hostname: ovos_messagebus + restart: unless-stopped + image: docker.io/smartgic/ovos-messagebus:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *common-environment + network_mode: host + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft:ro + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + + ovos_phal: + <<: [*podman, *resource-limits] + container_name: ovos_phal + hostname: ovos_phal + restart: unless-stopped + image: docker.io/smartgic/ovos-phal:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *audio-environment + network_mode: host + # Use specific capabilities instead of privileged mode where possible + cap_add: + - SYS_ADMIN + - DAC_OVERRIDE + # Only use privileged if absolutely necessary for hardware access + privileged: true + volumes: + - ~/.config/pulse/cookie:/home/${OVOS_USER}/.config/pulse/cookie:ro + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ${OVOS_CONFIG_PHAL_FOLDER}:/home/${OVOS_USER}/.config/OpenVoiceOS + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + - ${XDG_RUNTIME_DIR}/pipewire-0:${XDG_RUNTIME_DIR}/pipewire-0:ro + - ${XDG_RUNTIME_DIR}/pulse:${XDG_RUNTIME_DIR}/pulse:ro + depends_on: + ovos_messagebus: + condition: service_started + + ovos_phal_admin: + <<: [*podman, *resource-limits] + container_name: ovos_phal_admin + hostname: ovos_phal_admin + restart: unless-stopped + image: docker.io/smartgic/ovos-phal-admin:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *common-environment + network_mode: host + # Use specific capabilities instead of privileged mode where possible + cap_add: + - SYS_ADMIN + - DAC_OVERRIDE + # Only use privileged if absolutely necessary for hardware access + privileged: true + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ${OVOS_CONFIG_PHAL_FOLDER}:/home/${OVOS_USER}/.config/OpenVoiceOS + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + - /sys:/sys:ro + - /dev:/dev:ro + depends_on: + ovos_messagebus: + condition: service_started + + ovos_listener: + <<: [*podman, *resource-limits] + container_name: ovos_listener + hostname: ovos_listener + restart: unless-stopped + image: docker.io/smartgic/ovos-listener:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *audio-environment + network_mode: host + devices: + - /dev/snd + volumes: + - ~/.config/pulse/cookie:/home/${OVOS_USER}/.config/pulse/cookie:ro + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft:ro + - ovos_listener_records:/home/${OVOS_USER}/.local/share/mycroft/listener + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ovos_models:/home/${OVOS_USER}/.local/share/precise-lite + - ovos_vosk:/home/${OVOS_USER}/.local/share/vosk + - ${TMP_FOLDER}:/tmp/mycroft + - ${XDG_RUNTIME_DIR}/pipewire-0:${XDG_RUNTIME_DIR}/pipewire-0:ro + - ${XDG_RUNTIME_DIR}/pulse:${XDG_RUNTIME_DIR}/pulse:ro + depends_on: + ovos_messagebus: + condition: service_started + ovos_phal: + condition: service_started + + ovos_plugin_ggwave: + <<: [*podman, *resource-limits] + container_name: ovos_plugin_ggwave + hostname: ovos_plugin_ggwave + restart: unless-stopped + image: docker.io/smartgic/ovos-plugin-ggwave:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *audio-environment + network_mode: host + devices: + - /dev/snd + volumes: + - ~/.config/pulse/cookie:/home/${OVOS_USER}/.config/pulse/cookie:ro + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft:ro + - ${TMP_FOLDER}:/tmp/mycroft + - ${XDG_RUNTIME_DIR}/pipewire-0:${XDG_RUNTIME_DIR}/pipewire-0:ro + - ${XDG_RUNTIME_DIR}/pulse:${XDG_RUNTIME_DIR}/pulse:ro + depends_on: + ovos_messagebus: + condition: service_started + ovos_phal: + condition: service_started + healthcheck: + test: ["CMD", "pgrep", "-f", "ggwave"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 15s + + ovos_audio: + <<: [*podman, *resource-limits] + container_name: ovos_audio + hostname: ovos_audio + restart: unless-stopped + image: docker.io/smartgic/ovos-audio:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *audio-environment + DBUS_SESSION_BUS_ADDRESS: unix:path=${XDG_RUNTIME_DIR}/bus + network_mode: host + devices: + - /dev/snd + volumes: + - ~/.config/pulse/cookie:/home/${OVOS_USER}/.config/pulse/cookie:ro + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ovos_tts_cache:/home/${OVOS_USER}/.cache/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + - ${XDG_RUNTIME_DIR}/bus:${XDG_RUNTIME_DIR}/bus:ro + - ${XDG_RUNTIME_DIR}/pipewire-0:${XDG_RUNTIME_DIR}/pipewire-0:ro + - ${XDG_RUNTIME_DIR}/pulse:${XDG_RUNTIME_DIR}/pulse:ro + depends_on: + ovos_messagebus: + condition: service_started + ovos_phal: + condition: service_started + + ovos_core: + <<: [*podman, *core-resource-limits] + container_name: ovos_core + hostname: ovos_core + restart: unless-stopped + image: docker.io/smartgic/ovos-core:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *audio-environment + network_mode: host + devices: + - /dev/snd + volumes: + - ~/.config/pulse/cookie:/home/${OVOS_USER}/.config/pulse/cookie:ro + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ${OVOS_PERSONA_FOLDER}:/home/${OVOS_USER}/.config/ovos_persona + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ovos_nltk:/home/${OVOS_USER}/nltk_data + - ${OVOS_SHARE_FOLDER}:/home/${OVOS_USER}/.local/share/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + - ${XDG_RUNTIME_DIR}/pipewire-0:${XDG_RUNTIME_DIR}/pipewire-0:ro + - ${XDG_RUNTIME_DIR}/pulse:${XDG_RUNTIME_DIR}/pulse:ro + depends_on: + ovos_messagebus: + condition: service_started + ovos_phal: + condition: service_started + + ovos_cli: + <<: [*podman, *resource-limits] + container_name: ovos_cli + hostname: ovos_cli + restart: unless-stopped + image: docker.io/smartgic/ovos-cli:${VERSION} + logging: *default-logging + pull_policy: ${PULL_POLICY:-always} + environment: + <<: *common-environment + network_mode: host + volumes: + - ${OVOS_CONFIG_FOLDER}:/home/${OVOS_USER}/.config/mycroft + - ovos_local_state:/home/${OVOS_USER}/.local/state/mycroft + - ${TMP_FOLDER}:/tmp/mycroft + depends_on: + ovos_messagebus: + condition: service_started