[IMPROVED] Actualizar configuración y archivos del sistema

- 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 <noreply@anthropic.com>
This commit is contained in:
Mauro Rosero P. 2025-04-01 17:38:58 -05:00
parent 9e8420c287
commit 7e99c82b60
Signed by: mrosero
GPG key ID: 83BD2A5F674B7E26
4 changed files with 621 additions and 12 deletions

View file

@ -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

524
bin/haos.sh Executable file
View file

@ -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 <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. <mauro@rosero.one>]
#==============================================================================
# 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 <https://www.gnu.org/licenses/>.
# [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

View file

@ -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"

View file

@ -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