From 7e99c82b60b58ce0d91141f15c2be9ad760f927d Mon Sep 17 00:00:00 2001 From: "Mauro Rosero P." Date: Tue, 1 Apr 2025 17:38:58 -0500 Subject: [PATCH] =?UTF-8?q?[IMPROVED]=20Actualizar=20configuraci=C3=B3n=20?= =?UTF-8?q?y=20archivos=20del=20sistema?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Actualizar CLAUDE.md con instrucciones para usar version - A帽adir soporte para Home Assistant OS (haos.sh y mensajes) - Eliminar bin/ollama/podman-compose.yml (ahora se usa ~/.ollama) 馃 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- CLAUDE.md | 1 + bin/haos.sh | 524 ++++++++++++++++++++++++++++++++++ bin/msg/developers.es | 96 +++++++ bin/ollama/podman-compose.yml | 12 - 4 files changed, 621 insertions(+), 12 deletions(-) create mode 100755 bin/haos.sh delete mode 100644 bin/ollama/podman-compose.yml diff --git a/CLAUDE.md b/CLAUDE.md index 84ce2aa..917aa84 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -15,6 +15,7 @@ - Document function purpose with comments - Include usage examples in script headers - Handle errors with proper exit codes + - Use version from `bin/config/version` file in script header (#Version line) ## Development Practices - Use `bin/lib/base.lib` for common functions diff --git a/bin/haos.sh b/bin/haos.sh new file mode 100755 index 0000000..7d554fe --- /dev/null +++ b/bin/haos.sh @@ -0,0 +1,524 @@ +#!/bin/bash +#Script : haos.sh +#Apps : MRDEVS TOOLS +#Description : Instala y administra Home Assistant OS en Podman +#Author : Cortana Rosero One +#Created : 2025/04/01 12:00:00 +#Modified : 2025/04/01 12:00:00 +#Version : 1.3.0 +#============================================================================== +# Derechos de Autor [2025] [Mauro Rosero P. ] +#============================================================================== +# Este programa es software libre: usted puede redistribuirlo y/o modificarlo +# bajo los t茅rminos de la Licencia P煤blica Affero General de GNU tal como +# lo publica la Free Software Foundation, ya sea la versi贸n 3 de la licencia, +# o (a su elecci贸n) cualquier versi贸n posterior. +# +# Este programa se distribuye con la esperanza de que sea 煤til, +# pero SIN NINGUNA GARANT脥A; sin siquiera la garant铆a impl铆cita de +# COMERCIABILIDAD o IDONEIDAD PARA UN PROP脫SITO PARTICULAR. Consulte la +# Licencia P煤blica Affero General de GNU para obtener m谩s detalles. +# +# Deber铆a haber recibido una copia de la Licencia P煤blica Affero General +# junto con este programa. Si no la recibi贸, consulte . +# [Generated] Created by Claude Code (claude-3-7-sonnet-20250219) + +# Configuraci贸n inicial +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BIN_BASE="bin" +BIN_LIBS="lib" +BIN_MESG="msg" +BIN_CFGS="config" + +# Leer DEVSPATH desde el archivo de configuraci贸n o usar "devs" por defecto +if [ -f "$SCRIPT_DIR/config/devspath.dat" ]; then + DEVSPATH=$(cat "$SCRIPT_DIR/$BIN_CFGS/devspath.dat") +else + DEVSPATH="devs" +fi + +BIN_HOME="$HOME/$DEVSPATH" +BIN_PATH=$BIN_HOME/$BIN_BASE +VERSION=$(cat "$BIN_HOME/$BIN_BASE/$BIN_CFGS/version") + +# CHECK SHELL LANGUAGE +BIN_LANG=${LANG:0:2} + +# Importar bibliotecas necesarias +if [ -f "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/base.lib" ]; then + source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/base.lib" + # Cargar mensajes en el idioma del sistema o espa帽ol por defecto + load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "head" + # Cargar mensajes espec铆ficos de developers + load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "developers" + title="${head_000} ${head_002} - ${ha_000}" +fi + +# Verificar que estemos en una carpeta de proyectos +if [ -f "$SCRIPT_DIR/$BIN_CFGS/projects.dat" ]; then + PROJECTS_DIR=$(cat "$SCRIPT_DIR/$BIN_CFGS/projects.dat") +else + PROJECTS_DIR="projects" +fi + +# Comprobaci贸n de proyecto v谩lido +CURRENT_PATH="$PWD" +PROJECT_BASE="$HOME/$DEVSPATH/$PROJECTS_DIR" + +# Verificar que el directorio actual est茅 dentro de la carpeta de proyectos +if [[ "$CURRENT_PATH" != "$PROJECT_BASE"* ]]; then + echo "${head_002} ${head_warning}: ${ha_081}" + printf "${ha_082}\n" "$PROJECT_BASE" + + # Crear directorio de proyectos si no existe + if [ ! -d "$PROJECT_BASE" ]; then + printf "${ha_083}" "$PROJECT_BASE" | read -p CREATE_DIR + if [[ "$CREATE_DIR" =~ ^[Ss]$ ]]; then + mkdir -p "$PROJECT_BASE" + echo "${ha_084}" + fi + else + printf "${ha_085}\n" "$PROJECT_BASE" + fi + exit 1 +fi + +# Configuraci贸n b谩sica +HA_CONFIG_DIR="$PWD/ha" +HA_PORT=8123 +HA_NETWORKS="--network=host" # Modo host para descubrimiento de dispositivos + +# Configuraci贸n de versiones +HA_CORE_CONTAINER_NAME="homeassistant" +HA_CORE_IMAGE="ghcr.io/home-assistant/home-assistant:stable" + +HA_OS_CONTAINER_NAME="haos" +HA_OS_IMAGE="docker.io/homeassistant/home-assistant:stable" + +# Por defecto usamos Home Assistant Core +HA_CONTAINER_NAME=$HA_CORE_CONTAINER_NAME +HA_IMAGE=$HA_CORE_IMAGE +HA_TYPE="core" # puede ser "core" o "os" + +# Verificar si podman est谩 instalado +check_podman() { + if ! command -v podman &> /dev/null; then + echo "${ha_003}" + if [ -f "$BIN_PATH/bootstrap.sh" ]; then + $BIN_PATH/bootstrap.sh + else + echo "${ha_004}" + exit 1 + fi + else + echo "${ha_005}" + fi +} + +# Crear directorios necesarios +prepare_directories() { + echo "${ha_006}" + mkdir -p "$HA_CONFIG_DIR" + mkdir -p "$HA_CONFIG_DIR/config" + mkdir -p "$HA_CONFIG_DIR/media" + mkdir -p "$HA_CONFIG_DIR/ssl" + mkdir -p "$HA_CONFIG_DIR/share" + + # Asegurar permisos correctos + chmod -R 755 "$HA_CONFIG_DIR" +} + +# Seleccionar versi贸n de Home Assistant +select_ha_version() { + echo "${ha_086}" + echo "${ha_087}" + echo "${ha_088}" + + local choice + read -p "${ha_089}" choice + + case $choice in + 1) + echo "${ha_091}" + HA_CONTAINER_NAME=$HA_CORE_CONTAINER_NAME + HA_IMAGE=$HA_CORE_IMAGE + HA_TYPE="core" + ;; + 2) + echo "${ha_092}" + HA_CONTAINER_NAME=$HA_OS_CONTAINER_NAME + HA_IMAGE=$HA_OS_IMAGE + HA_TYPE="os" + ;; + *) + echo "${ha_090}" + select_ha_version + ;; + esac +} + +# Instalar Home Assistant en podman +install() { + check_podman + prepare_directories + + # Seleccionar qu茅 versi贸n de Home Assistant instalar + select_ha_version + + # Descargar la imagen apropiada + if [ "$HA_TYPE" = "core" ]; then + echo "${ha_007}" + else + echo "${ha_093}" + fi + podman pull $HA_IMAGE + + if podman container exists $HA_CONTAINER_NAME; then + printf "${ha_008}\n" "$HA_CONTAINER_NAME" + printf "${ha_009}\n" "$0" + exit 1 + fi + + echo "${ha_010}" + podman run -d \ + --name=$HA_CONTAINER_NAME \ + $HA_NETWORKS \ + -v "$HA_CONFIG_DIR/config:/config" \ + -v "$HA_CONFIG_DIR/media:/media" \ + -v "$HA_CONFIG_DIR/ssl:/ssl" \ + -v "$HA_CONFIG_DIR/share:/share" \ + --restart=unless-stopped \ + $HA_IMAGE + + if [ $? -eq 0 ]; then + echo "${ha_011}" + printf "${ha_002}\n" "$HA_PORT" + echo "${ha_012}" + else + echo "${ha_013}" + exit 1 + fi +} + +# Iniciar el contenedor de Home Assistant +start() { + if ! podman container exists $HA_CONTAINER_NAME; then + printf "${ha_014}\n" "$HA_CONTAINER_NAME" + printf "${ha_015}\n" "$0" + exit 1 + fi + + if podman container inspect $HA_CONTAINER_NAME --format '{{.State.Running}}' | grep -q "true"; then + echo "${ha_001}" + printf "${ha_002}\n" "$HA_PORT" + return 0 + fi + + echo "${ha_016}" + podman start $HA_CONTAINER_NAME + + if [ $? -eq 0 ]; then + echo "${ha_017}" + printf "${ha_002}\n" "$HA_PORT" + else + echo "${ha_018}" + exit 1 + fi +} + +# Detener el contenedor de Home Assistant +stop() { + if ! podman container exists $HA_CONTAINER_NAME; then + printf "${ha_019}\n" "$HA_CONTAINER_NAME" + return 1 + fi + + if ! podman container inspect $HA_CONTAINER_NAME --format '{{.State.Running}}' | grep -q "true"; then + echo "${ha_020}" + return 0 + fi + + echo "${ha_021}" + podman stop $HA_CONTAINER_NAME + + if [ $? -eq 0 ]; then + echo "${ha_022}" + else + echo "${ha_023}" + exit 1 + fi +} + +# Reiniciar el contenedor de Home Assistant +restart() { + echo "${ha_024}" + + stop + sleep 3 + start +} + +# Mostrar el estado del contenedor de Home Assistant +status() { + if ! podman container exists $HA_CONTAINER_NAME; then + echo "${ha_026}" + return 1 + fi + + echo "${ha_025}" + podman container inspect $HA_CONTAINER_NAME --format '{{.State.Status}}' + + if podman container inspect $HA_CONTAINER_NAME --format '{{.State.Running}}' | grep -q "true"; then + echo "${ha_027}" + printf "${ha_028}\n" "$HA_PORT" + printf "${ha_029}\n" "$HA_CONFIG_DIR" + + # Mostrar tiempo de ejecuci贸n + local start_time=$(podman container inspect $HA_CONTAINER_NAME --format '{{.State.StartedAt}}') + [ -n "$start_time" ] && printf "${ha_030}\n" "$start_time" + + # Verificar si el servicio est谩 respondiendo + if command -v curl &>/dev/null; then + if curl -s "http://localhost:$HA_PORT" >/dev/null; then + echo "${ha_031}" + else + echo "${ha_032}" + fi + fi + else + echo "${ha_033}" + fi +} + +# Actualizar la imagen de Home Assistant +update() { + echo "${ha_034}" + + # Detener el contenedor existente + stop + + # Guardar la informaci贸n del contenedor actual + echo "${ha_035}" + podman commit $HA_CONTAINER_NAME homeassistant-backup + + # Descargar la nueva imagen + echo "${ha_036}" + podman pull $HA_IMAGE + + # Eliminar el contenedor actual pero mantener los vol煤menes + echo "${ha_037}" + podman rm $HA_CONTAINER_NAME + + # Recrear el contenedor con la nueva imagen + echo "${ha_038}" + podman run -d \ + --name=$HA_CONTAINER_NAME \ + $HA_NETWORKS \ + -v "$HA_CONFIG_DIR/config:/config" \ + -v "$HA_CONFIG_DIR/media:/media" \ + -v "$HA_CONFIG_DIR/ssl:/ssl" \ + -v "$HA_CONFIG_DIR/share:/share" \ + --restart=unless-stopped \ + $HA_IMAGE + + if [ $? -eq 0 ]; then + echo "${ha_039}" + printf "${ha_002}\n" "$HA_PORT" + echo "${ha_040}" + echo "podman stop homeassistant && podman rm homeassistant && podman tag homeassistant-backup homeassistant && podman run -d [opciones] homeassistant" + else + echo "${ha_041}" + podman run -d \ + --name=$HA_CONTAINER_NAME \ + $HA_NETWORKS \ + -v "$HA_CONFIG_DIR/config:/config" \ + -v "$HA_CONFIG_DIR/media:/media" \ + -v "$HA_CONFIG_DIR/ssl:/ssl" \ + -v "$HA_CONFIG_DIR/share:/share" \ + --restart=unless-stopped \ + homeassistant-backup + + if [ $? -eq 0 ]; then + echo "${ha_042}" + else + echo "${ha_043}" + fi + fi +} + +# Eliminar el contenedor de Home Assistant +remove() { + echo "${ha_044}" + + # Detener el contenedor primero + stop + + # Preguntar si se desea realizar una copia de seguridad + read -p "${ha_045}" BACKUP + if [[ "$BACKUP" =~ ^[Ss]$ ]]; then + echo "${ha_046}" + podman commit $HA_CONTAINER_NAME homeassistant-backup + echo "${ha_047}" + fi + + # Preguntar si se desea eliminar los datos de configuraci贸n + read -p "${ha_048}" REMOVE_CONFIG + + # Eliminar el contenedor + podman rm $HA_CONTAINER_NAME + + if [[ "$REMOVE_CONFIG" =~ ^[Ss]$ ]]; then + echo "${ha_049}" + rm -rf "$HA_CONFIG_DIR" + fi + + echo "${ha_050}" +} + +# Mostrar los logs del contenedor +logs() { + if ! podman container exists $HA_CONTAINER_NAME; then + printf "${ha_019}\n" "$HA_CONTAINER_NAME" + return 1 + fi + + echo "${ha_051}" + podman logs -f $HA_CONTAINER_NAME +} + +# Configuraci贸n de complementos adicionales +setup_addons() { + echo "${ha_052}" + + # Verifica si Home Assistant est谩 ejecut谩ndose + if ! podman container inspect $HA_CONTAINER_NAME --format '{{.State.Running}}' | grep -q "true"; then + echo "${ha_053}" + echo "${ha_054}" + start + fi + + echo "${ha_055}" + echo "1. MQTT Broker (Mosquitto)" + echo "2. Z-Wave JS" + echo "3. Zigbee2MQTT" + echo "4. AdGuard Home" + echo "5. Node-RED" + echo "0. Cancelar" + + read -p "${ha_056}" ADDON_CHOICE + + case $ADDON_CHOICE in + 1) + echo "${ha_057}" + podman run -d \ + --name=mosquitto \ + --network=host \ + -v "$HA_CONFIG_DIR/mosquitto:/mosquitto" \ + -p 1883:1883 \ + --restart=unless-stopped \ + eclipse-mosquitto:latest + echo "${ha_058}" + ;; + 2) + echo "${ha_059}" + podman run -d \ + --name=zwavejs \ + --network=host \ + -v "$HA_CONFIG_DIR/zwavejs:/usr/src/app/store" \ + --device=/dev/ttyUSB0:/dev/ttyUSB0 \ + -p 8091:8091 \ + --restart=unless-stopped \ + zwavejs/zwavejs2mqtt:latest + echo "${ha_060}" + ;; + 3) + echo "${ha_061}" + mkdir -p "$HA_CONFIG_DIR/zigbee2mqtt/data" + podman run -d \ + --name=zigbee2mqtt \ + --network=host \ + -v "$HA_CONFIG_DIR/zigbee2mqtt/data:/app/data" \ + --device=/dev/ttyUSB0:/dev/ttyUSB0 \ + -p 8080:8080 \ + --restart=unless-stopped \ + koenkk/zigbee2mqtt:latest + echo "${ha_062}" + ;; + 4) + echo "${ha_063}" + podman run -d \ + --name=adguardhome \ + --network=host \ + -v "$HA_CONFIG_DIR/adguardhome/workdir:/opt/adguardhome/work" \ + -v "$HA_CONFIG_DIR/adguardhome/confdir:/opt/adguardhome/conf" \ + -p 53:53/tcp -p 53:53/udp \ + -p 80:80/tcp -p 443:443/tcp -p 3000:3000/tcp \ + --restart=unless-stopped \ + adguard/adguardhome:latest + echo "${ha_064}" + ;; + 5) + echo "${ha_065}" + podman run -d \ + --name=nodered \ + --network=host \ + -v "$HA_CONFIG_DIR/nodered:/data" \ + -p 1880:1880 \ + --restart=unless-stopped \ + nodered/node-red:latest + echo "${ha_066}" + ;; + 0) + echo "${ha_067}" + ;; + *) + echo "${ha_068}" + ;; + esac +} + +# Funci贸n principal y procesamiento de comandos +case "$1" in + install) + install + ;; + start) + start + ;; + stop) + stop + ;; + restart) + restart + ;; + status) + status + ;; + update) + update + ;; + remove) + remove + ;; + logs) + logs + ;; + addons) + setup_addons + ;; + *) + echo "${ha_069}" + printf "${ha_070}\n" "$0" + echo "" + echo "${ha_071}" + echo "${ha_072}" + echo "${ha_073}" + echo "${ha_074}" + echo "${ha_075}" + echo "${ha_076}" + echo "${ha_077}" + echo "${ha_078}" + echo "${ha_079}" + echo "${ha_080}" + ;; +esac \ No newline at end of file diff --git a/bin/msg/developers.es b/bin/msg/developers.es index 9936408..8dfca2b 100644 --- a/bin/msg/developers.es +++ b/bin/msg/developers.es @@ -187,6 +187,102 @@ qrmsg_012="Error" qrmsg_013="Dialog no est谩 instalado" qrmsg_014="Zbar no est谩 instalado" +# Mensajes para Home Assistant OS +ha_000="GESTOR DE HOME ASSISTANT OS" +ha_001="Home Assistant ya est谩 en ejecuci贸n" +ha_002="Accede a Home Assistant en: http://localhost:%s" +ha_003="Podman no est谩 instalado. Instalando..." +ha_004="Error: No se encuentra el script bootstrap.sh" +ha_005="Podman est谩 instalado." +ha_006="Preparando directorios para Home Assistant..." +ha_007="Descargando imagen de Home Assistant..." +ha_086="Selecciona la versi贸n de Home Assistant a instalar:" +ha_087="1. Home Assistant Core (Aplicaci贸n regular)" +ha_088="2. Home Assistant OS (Sistema operativo completo)" +ha_089="Selecciona una opci贸n (1-2): " +ha_090="Opci贸n no v谩lida. Por favor, selecciona 1 o 2." +ha_091="Preparando instalaci贸n de Home Assistant Core..." +ha_092="Preparando instalaci贸n de Home Assistant OS..." +ha_093="Descargando imagen de Home Assistant OS..." +ha_008="El contenedor %s ya existe. Removerlo antes de instalar." +ha_009="Usa: %s remove para eliminar el contenedor existente." +ha_010="Creando contenedor de Home Assistant..." +ha_011="Home Assistant instalado correctamente." +ha_012="Espera unos minutos mientras Home Assistant se inicia por primera vez." +ha_013="Error al crear el contenedor de Home Assistant." +ha_014="El contenedor %s no existe. Inst谩lalo primero." +ha_015="Usa: %s install para instalar Home Assistant." +ha_016="Iniciando Home Assistant..." +ha_017="Home Assistant iniciado correctamente." +ha_018="Error al iniciar Home Assistant." +ha_019="El contenedor %s no existe." +ha_020="Home Assistant ya est谩 detenido." +ha_021="Deteniendo Home Assistant..." +ha_022="Home Assistant detenido correctamente." +ha_023="Error al detener Home Assistant." +ha_024="Reiniciando Home Assistant..." +ha_025="Estado de Home Assistant:" +ha_026="Home Assistant no est谩 instalado." +ha_027="Home Assistant est谩 en ejecuci贸n:" +ha_028=" - URL: http://localhost:%s" +ha_029=" - Directorio de configuraci贸n: %s" +ha_030=" - Iniciado: %s" +ha_031=" - Estado: Respondiendo" +ha_032=" - Estado: Proceso en ejecuci贸n pero no responde HTTP" +ha_033="Home Assistant est谩 detenido." +ha_034="Actualizando Home Assistant..." +ha_035="Respaldando configuraci贸n actual..." +ha_036="Descargando la nueva imagen de Home Assistant..." +ha_037="Eliminando el contenedor actual..." +ha_038="Recreando el contenedor con la nueva imagen..." +ha_039="Home Assistant actualizado correctamente." +ha_040="Si encuentras problemas, puedes restaurar la copia de seguridad con:" +ha_041="Error al actualizar Home Assistant. Intentando restaurar la versi贸n anterior..." +ha_042="Restauraci贸n exitosa de la versi贸n anterior." +ha_043="Error al restaurar la versi贸n anterior. Es posible que debas reinstalar Home Assistant." +ha_044="Eliminando el contenedor de Home Assistant..." +ha_045="驴Deseas realizar una copia de seguridad antes de eliminar? (s/N): " +ha_046="Realizando copia de seguridad..." +ha_047="Copia de seguridad creada como imagen: homeassistant-backup" +ha_048="驴Deseas eliminar tambi茅n los directorios de configuraci贸n? (s/N): " +ha_049="Eliminando directorios de configuraci贸n..." +ha_050="Home Assistant eliminado correctamente." +ha_051="Mostrando logs de Home Assistant (Ctrl+C para salir):" +ha_052="Configurando complementos adicionales para Home Assistant..." +ha_053="Home Assistant debe estar en ejecuci贸n para configurar complementos." +ha_054="Iniciando Home Assistant..." +ha_055="Complementos disponibles:" +ha_056="Selecciona un complemento para instalar (0-5): " +ha_057="Instalando MQTT Broker (Mosquitto)..." +ha_058="MQTT Broker instalado. Config煤ralo en Home Assistant." +ha_059="Instalando Z-Wave JS..." +ha_060="Z-Wave JS instalado. Accede a UI en http://localhost:8091" +ha_061="Instalando Zigbee2MQTT..." +ha_062="Zigbee2MQTT instalado. Config煤ralo en Home Assistant." +ha_063="Instalando AdGuard Home..." +ha_064="AdGuard Home instalado. Config煤ralo en http://localhost:3000" +ha_065="Instalando Node-RED..." +ha_066="Node-RED instalado. Accede a http://localhost:1880" +ha_067="Operaci贸n cancelada." +ha_068="Opci贸n no v谩lida." +ha_069="Home Assistant OS en Podman" +ha_070="Uso: %s {install|start|stop|restart|status|update|remove|logs|addons}" +ha_071="Comandos:" +ha_081="Este script debe ejecutarse desde una carpeta de proyecto." +ha_082="La carpeta de proyectos es: %s" +ha_083="驴Deseas crear la carpeta de proyectos %s? (s/N): " +ha_084="Carpeta de proyectos creada. Por favor, crea un proyecto dentro y ejecuta este script desde ah铆." +ha_085="Por favor, navega a un directorio dentro de %s para ejecutar este script." +ha_072=" install - Instala Home Assistant en un contenedor Podman" +ha_073=" start - Inicia el contenedor de Home Assistant" +ha_074=" stop - Detiene el contenedor de Home Assistant" +ha_075=" restart - Reinicia el contenedor de Home Assistant" +ha_076=" status - Muestra el estado del contenedor de Home Assistant" +ha_077=" update - Actualiza Home Assistant a la 煤ltima versi贸n" +ha_078=" remove - Elimina el contenedor de Home Assistant" +ha_079=" logs - Muestra los logs en tiempo real" +ha_080=" addons - Configura complementos adicionales" + # Mensajes para fjadmin_install.sh fjmsg_000="INSTALADOR DE FORGEJO CLI" fjmsg_001="Instalando Forgejo CLI" diff --git a/bin/ollama/podman-compose.yml b/bin/ollama/podman-compose.yml deleted file mode 100644 index 905184b..0000000 --- a/bin/ollama/podman-compose.yml +++ /dev/null @@ -1,12 +0,0 @@ -version: "3.8" - -services: - ollama: - image: docker.io/ollama/ollama:latest - container_name: ollama - privileged: true - ports: - - "11434:11434" - volumes: - - ../../data:/root/.ollama - restart: unless-stopped