From 32fae38f39be675ad2d40172c8264d96cf44cedb Mon Sep 17 00:00:00 2001 From: tc-lraigoso Date: Fri, 22 May 2026 20:43:37 -0500 Subject: [PATCH] Refine container startup policy and add LibreChat service configuration --- README.md | 181 ++++++++++++++++++++++++++- compose/airflow-service.yaml | 8 +- compose/apache-hop-service.yaml | 4 +- compose/apache-nifi.service.yaml | 2 +- compose/cassandra-service.yaml | 2 +- compose/grafana-service.yaml | 2 +- compose/librechat-service.yaml | 103 +++++++++++++++ compose/mysql-service.yaml | 2 +- compose/n8n-service.yaml | 2 +- compose/nodered-service.yaml | 2 +- compose/open-webui-service.yaml | 25 ++++ compose/portainer-agent-service.yaml | 2 +- compose/qwen3-coder-service.yaml | 47 +++++++ compose/qwen3-service.yaml | 47 +++++++ config/librechat.yaml | 46 +++++++ env/librechat-service.env | 30 +++++ estructura.txt | 6 + 17 files changed, 497 insertions(+), 14 deletions(-) create mode 100644 compose/librechat-service.yaml create mode 100644 compose/open-webui-service.yaml create mode 100644 compose/qwen3-coder-service.yaml create mode 100644 compose/qwen3-service.yaml create mode 100644 config/librechat.yaml create mode 100644 env/librechat-service.env diff --git a/README.md b/README.md index 218adce..d05cdfe 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ Este repositorio resuelve tres problemas comunes en equipos de datos e integraci - Cassandra: base NoSQL distribuida opcional para alta escritura. - Portainer: administración visual del ciclo operativo de contenedores. - Portainer Agent: endpoint remoto opcional para administrar otros hosts Docker desde Portainer. +- Open WebUI: interfaz web tipo ChatGPT para consumir modelos de Ollama. ## Arquitectura lógica @@ -111,6 +112,15 @@ docker volume create apache-nifi_nifi_logs docker volume create nodered_nodered_data docker volume create mysql_mysql_data docker volume create cassandra_cassandra_data +docker volume create qwen3_coder_models +docker volume create qwen3_models +docker volume create open-webui_open_webui_data +docker volume create librechat_mongodb_data +docker volume create librechat_meili_data +docker volume create librechat_pgdata +docker volume create librechat_images +docker volume create librechat_uploads +docker volume create librechat_logs ``` ## Alcance del repositorio @@ -144,6 +154,9 @@ docker compose -f compose/apache-nifi.service.yaml up -d docker compose -f compose/nodered-service.yaml --env-file env/nodered-service.env up -d docker compose -f compose/mysql-service.yaml --env-file env/mysql-service.env up -d docker compose -f compose/cassandra-service.yaml --env-file env/cassandra-service.env up -d +docker compose -f compose/qwen3-service.yaml up -d +docker compose -f compose/open-webui-service.yaml up -d +docker compose -f compose/librechat-service.yaml --env-file env/librechat-service.env up -d ``` ## Operación desde Portainer @@ -213,6 +226,9 @@ docker compose -f compose/mysql-service.yaml --env-file env/mysql-service.env up docker compose -f compose/cassandra-service.yaml --env-file env/cassandra-service.env pull cassandra docker compose -f compose/cassandra-service.yaml --env-file env/cassandra-service.env up -d --no-deps --force-recreate cassandra + +docker compose -f compose/open-webui-service.yaml pull open-webui +docker compose -f compose/open-webui-service.yaml up -d --no-deps --force-recreate open-webui ``` Migración única desde stacks creados antes de esta normalización: @@ -352,6 +368,7 @@ Alta del endpoint en Portainer: | MySQL | localhost | 3306 | TCP, servicio opcional | | Cassandra | localhost | 9042 | CQL/TCP, servicio opcional | | Portainer | https://localhost:9443 | 9443 (UI) / 8000 (Edge) | Gestión operativa de contenedores | +| LibreChat | http://localhost:3200 | 3200 | Chat multi-modelo con autodetección por endpoint Ollama | ## Variables de entorno @@ -435,6 +452,158 @@ CASSANDRA_MAX_HEAP_SIZE=512M CASSANDRA_HEAP_NEWSIZE=100M ``` +### Qwen3-Coder + +El servicio se expone en `http://HOST_DEL_SERVIDOR:11434` para que otros equipos de tu red local puedan invocarlo. + +Despliegue: + +```sh +docker compose -f compose/qwen3-coder-service.yaml up -d +``` + +Modelo por defecto: + +```sh +QWEN3_CODER_MODEL=qwen3-coder:latest +``` + +Ejemplo de invocación desde otro PC de la red: + +```sh +curl http://HOST_DEL_SERVIDOR:11434/api/generate \ + -H "Content-Type: application/json" \ + -d "{\"model\":\"qwen3-coder:latest\",\"prompt\":\"Escribe una funcion en Python\",\"stream\":false}" +``` + +Necesitas para exponerlo en la red local: + +1. La IP LAN del host donde corre Docker. +2. El puerto `11434` abierto en el firewall del host. +3. Que el host no tenga una política de red que bloquee conexiones entrantes desde tu subred. +4. Que el volumen `qwen3_coder_models` exista antes del primer despliegue. + +### Consumo desde VS Code + +La forma más directa de consumir este modelo desde VS Code es con una extensión que soporte proveedores compatibles con Ollama, por ejemplo Continue. + +Configuración mínima para Continue: + +```json +{ + "models": [ + { + "title": "Qwen3-Coder", + "provider": "ollama", + "model": "qwen3-coder:latest", + "apiBase": "http://IP_DEL_HOST:11434" + } + ] +} +``` + +Si VS Code corre en la misma máquina que Docker, puedes usar `http://localhost:11434`. Si corre en otra PC, usa la IP LAN del host donde quedó publicado el servicio. + +Copilot Chat no permite apuntar libremente a un modelo local arbitrario; para consumo directo de este Ollama local, usa una extensión que acepte un endpoint OpenAI/Ollama o un proveedor similar. + +### Qwen3 (multipropósito) + +Servicio dedicado para modelo generalista Qwen3 con los mismos límites de recursos que Qwen3-Coder. + +Despliegue: + +```sh +docker compose -f compose/qwen3-service.yaml up -d +``` + +Modelo por defecto: + +```sh +QWEN3_MODEL=qwen3:latest +``` + +Endpoint API: + +```text +http://HOST_DEL_SERVIDOR:11435 +``` + +Prueba rápida: + +```sh +curl http://HOST_DEL_SERVIDOR:11435/api/generate \ + -H "Content-Type: application/json" \ + -d "{\"model\":\"qwen3:latest\",\"prompt\":\"Resume en una linea que puedes hacer\",\"stream\":false}" +``` + +### Open WebUI (chat tipo ChatGPT) + +Open WebUI permite usar una interfaz web para conversar con Qwen3-Coder y otros modelos Ollama desde navegador. + +Despliegue: + +```sh +docker compose -f compose/open-webui-service.yaml up -d +``` + +Acceso web: + +```text +http://HOST_DEL_SERVIDOR:3100 +``` + +Notas operativas: + +1. El servicio usa persistencia en el volumen `open-webui_open_webui_data`. +2. Está configurado para hablar con múltiples instancias Ollama dentro de la red Docker `red-principal` usando `OLLAMA_BASE_URLS`. +3. Configuración actual de backends: `http://qwen3-coder:11434;http://qwen3:11434`. +4. Puedes agregar más modelos con `ollama pull` y aparecerán en el selector del chat. +5. Si despliegas otra instancia de Ollama, agrega su URL al `OLLAMA_BASE_URLS` y recrea `open-webui`. + +### LibreChat (chat tipo ChatGPT multi-endpoint) + +LibreChat permite consumir múltiples endpoints Ollama con autodetección de modelos por endpoint (`models.fetch: true`). + +Despliegue: + +```sh +docker compose -f compose/librechat-service.yaml --env-file env/librechat-service.env up -d +``` + +Acceso web: + +```text +http://HOST_DEL_SERVIDOR:3200 +``` + +Notas operativas: + +1. El stack usa `compose/librechat-service.yaml`, `env/librechat-service.env` y `config/librechat.yaml`. +2. La detección automática aplica a los endpoints configurados en `config/librechat.yaml`. +3. Endpoints iniciales: `ollama-coder` (`qwen3-coder`) y `ollama-general` (`qwen3`). +4. Para sumar otra instancia Ollama, agrega un nuevo bloque en `endpoints.custom` con nombre que empiece por `ollama-` y `models.fetch: true`. +5. Incluye persistencia en volúmenes externos para MongoDB, Meilisearch, RAG y datos de la app. + +### env/librechat-service.env + +Variables mínimas incluidas: + +```env +HOST=0.0.0.0 +PORT=3200 +DOMAIN_CLIENT=http://localhost:3200 +DOMAIN_SERVER=http://localhost:3200 +MONGO_URI=mongodb://mongodb:27017/LibreChat +MEILI_HOST=http://meilisearch:7700 +MEILI_MASTER_KEY=change_me_meili_master_key +RAG_API_URL=http://rag_api:8000 +JWT_SECRET=change_me_jwt_secret +JWT_REFRESH_SECRET=change_me_jwt_refresh_secret +CREDS_KEY=change_me_creds_key +CREDS_IV=change_me_creds_iv +ENDPOINTS=custom +``` + ## Mejoras y optimizaciones aplicadas 1. Se definió una plantilla recomendada para variables de Airflow (sin aplicarla automáticamente). @@ -470,6 +639,9 @@ docker compose -f compose/apache-nifi.service.yaml config docker compose -f compose/nodered-service.yaml --env-file env/nodered-service.env config docker compose -f compose/mysql-service.yaml --env-file env/mysql-service.env config docker compose -f compose/cassandra-service.yaml --env-file env/cassandra-service.env config +docker compose -f compose/qwen3-service.yaml config +docker compose -f compose/open-webui-service.yaml config +docker compose -f compose/librechat-service.yaml --env-file env/librechat-service.env config ``` ## WSL (Ubuntu-24.04) @@ -495,6 +667,10 @@ docker-services/ │ ├── mysql-service.yaml │ ├── n8n-service.yaml │ ├── nodered-service.yaml +│ ├── open-webui-service.yaml +│ ├── librechat-service.yaml +│ ├── qwen3-service.yaml +│ ├── qwen3-coder-service.yaml │ ├── portainer-agent-service.yaml │ ├── portainer-service.yaml │ └── postgresql-service.yaml @@ -504,8 +680,11 @@ docker-services/ │ ├── grafana-service.env │ ├── mysql-service.env │ ├── n8n-service.env -│ └── nodered-service.env +│ ├── nodered-service.env +│ └── librechat-service.env ├── config/ +│ ├── librechat.yaml +│ └── .env ├── container-audit-ubuntu-24.04.md ├── devlog.md ├── estructura.txt diff --git a/compose/airflow-service.yaml b/compose/airflow-service.yaml index ed6eff2..31b521d 100644 --- a/compose/airflow-service.yaml +++ b/compose/airflow-service.yaml @@ -4,7 +4,7 @@ services: redis: image: redis:latest container_name: redis_server - restart: unless-stopped + restart: "no" command: redis-server --requirepass ${REDIS_PASSWORD} --maxmemory 512mb --maxmemory-policy volatile-lru --appendonly yes ports: - "6379:6379" @@ -54,7 +54,7 @@ services: airflow-webserver: image: apache/airflow:${AIRFLOW_VERSION}-python3.12 container_name: airflow_apiserver - restart: unless-stopped + restart: "no" ports: - "${AIRFLOW_PORT:-8080}:8080" environment: @@ -82,7 +82,7 @@ services: airflow-scheduler: image: apache/airflow:${AIRFLOW_VERSION}-python3.12 container_name: airflow_scheduler - restart: unless-stopped + restart: "no" environment: AIRFLOW__CORE__EXECUTOR: CeleryExecutor AIRFLOW__CELERY__BROKER_URL: redis://:${REDIS_PASSWORD}@redis_server:6379/0 @@ -106,7 +106,7 @@ services: airflow-worker: image: apache/airflow:${AIRFLOW_VERSION}-python3.12 container_name: airflow_worker - restart: unless-stopped + restart: "no" environment: AIRFLOW__CORE__EXECUTOR: CeleryExecutor AIRFLOW__CELERY__BROKER_URL: redis://:${REDIS_PASSWORD}@redis_server:6379/0 diff --git a/compose/apache-hop-service.yaml b/compose/apache-hop-service.yaml index 44fb6f4..ff0d493 100644 --- a/compose/apache-hop-service.yaml +++ b/compose/apache-hop-service.yaml @@ -94,7 +94,7 @@ services: sha256sum -c /hop/projects/my_project/metadata/environments/dev.json.sha256 || { echo '❌ dev.json ha sido alterado o está corrupto'; exit 1; }; echo '✔️ Archivos verificados. Iniciando Hop Server...'; exec hop-server.sh -run" - restart: unless-stopped + restart: "no" depends_on: - hop-init networks: @@ -121,7 +121,7 @@ services: - ../config:/hop/config - ../logs:/var/log/hop - ../audit:/usr/local/tomcat/webapps/ROOT/audit - restart: unless-stopped + restart: "no" depends_on: - hop-init - hop-server diff --git a/compose/apache-nifi.service.yaml b/compose/apache-nifi.service.yaml index 6f82f11..994e6be 100644 --- a/compose/apache-nifi.service.yaml +++ b/compose/apache-nifi.service.yaml @@ -4,7 +4,7 @@ services: nifi: image: apache/nifi:latest container_name: nifi - restart: unless-stopped + restart: "no" ports: - "8443:8443" # Accederás en https://localhost:8443/nifi environment: diff --git a/compose/cassandra-service.yaml b/compose/cassandra-service.yaml index cb7cf85..a3f45c4 100644 --- a/compose/cassandra-service.yaml +++ b/compose/cassandra-service.yaml @@ -4,7 +4,7 @@ services: cassandra: image: cassandra:latest container_name: cassandra-server - restart: unless-stopped + restart: "no" ports: - "${CASSANDRA_PORT:-9042}:9042" environment: diff --git a/compose/grafana-service.yaml b/compose/grafana-service.yaml index d501fb9..c092f68 100644 --- a/compose/grafana-service.yaml +++ b/compose/grafana-service.yaml @@ -30,7 +30,7 @@ services: grafana-server: image: grafana/grafana:latest container_name: grafana-server - restart: always + restart: "no" depends_on: - grafana-init networks: diff --git a/compose/librechat-service.yaml b/compose/librechat-service.yaml new file mode 100644 index 0000000..6839c4e --- /dev/null +++ b/compose/librechat-service.yaml @@ -0,0 +1,103 @@ +name: librechat + +services: + librechat: + image: registry.librechat.ai/danny-avila/librechat-dev:latest + container_name: librechat + restart: "no" + depends_on: + - mongodb + - meilisearch + - rag_api + ports: + - "3200:3200" + env_file: + - ../env/librechat-service.env + environment: + HOST: 0.0.0.0 + CONFIG_PATH: /app/librechat.yaml + MONGO_URI: mongodb://mongodb:27017/LibreChat + MEILI_HOST: http://meilisearch:7700 + RAG_API_URL: http://rag_api:8000 + volumes: + - ../env/librechat-service.env:/app/.env:ro + - ../config/librechat.yaml:/app/librechat.yaml:ro + - librechat_images:/app/client/public/images + - librechat_uploads:/app/uploads + - librechat_logs:/app/logs + networks: + - red-principal + + mongodb: + image: mongo:8.0.20 + container_name: librechat-mongodb + restart: "no" + command: mongod --noauth + volumes: + - librechat_mongodb_data:/data/db + networks: + - red-principal + + meilisearch: + image: getmeili/meilisearch:v1.35.1 + container_name: librechat-meilisearch + restart: "no" + environment: + MEILI_HOST: http://meilisearch:7700 + MEILI_NO_ANALYTICS: "true" + MEILI_MASTER_KEY: ${MEILI_MASTER_KEY:-change_me_meili_master_key} + volumes: + - librechat_meili_data:/meili_data + networks: + - red-principal + + vectordb: + image: pgvector/pgvector:0.8.0-pg15-trixie + container_name: librechat-vectordb + restart: "no" + environment: + POSTGRES_DB: mydatabase + POSTGRES_USER: myuser + POSTGRES_PASSWORD: mypassword + volumes: + - librechat_pgdata:/var/lib/postgresql/data + networks: + - red-principal + + rag_api: + image: registry.librechat.ai/danny-avila/librechat-rag-api-dev-lite:latest + container_name: librechat-rag-api + restart: "no" + depends_on: + - vectordb + env_file: + - ../env/librechat-service.env + environment: + DB_HOST: vectordb + RAG_PORT: 8000 + networks: + - red-principal + +volumes: + librechat_mongodb_data: + name: librechat_mongodb_data + external: true + librechat_meili_data: + name: librechat_meili_data + external: true + librechat_pgdata: + name: librechat_pgdata + external: true + librechat_images: + name: librechat_images + external: true + librechat_uploads: + name: librechat_uploads + external: true + librechat_logs: + name: librechat_logs + external: true + +networks: + red-principal: + external: true diff --git a/compose/mysql-service.yaml b/compose/mysql-service.yaml index 5054374..018ba32 100644 --- a/compose/mysql-service.yaml +++ b/compose/mysql-service.yaml @@ -4,7 +4,7 @@ services: mysql: image: mysql:latest container_name: mysql-server - restart: unless-stopped + restart: "no" ports: - "${MYSQL_PORT:-3306}:3306" environment: diff --git a/compose/n8n-service.yaml b/compose/n8n-service.yaml index e6c0780..36d42ec 100644 --- a/compose/n8n-service.yaml +++ b/compose/n8n-service.yaml @@ -39,7 +39,7 @@ services: n8n-server: image: n8nio/n8n:latest container_name: n8n-server - restart: always + restart: "no" depends_on: - n8n-init environment: diff --git a/compose/nodered-service.yaml b/compose/nodered-service.yaml index f5ecf5a..b391eca 100644 --- a/compose/nodered-service.yaml +++ b/compose/nodered-service.yaml @@ -4,7 +4,7 @@ services: nodered: image: nodered/node-red:latest container_name: nodered - restart: unless-stopped + restart: "no" ports: - "${NODERED_PORT:-1880}:1880" environment: diff --git a/compose/open-webui-service.yaml b/compose/open-webui-service.yaml new file mode 100644 index 0000000..2d96503 --- /dev/null +++ b/compose/open-webui-service.yaml @@ -0,0 +1,25 @@ +name: open-webui + +services: + open-webui: + image: ghcr.io/open-webui/open-webui:main + container_name: open-webui + restart: "no" + ports: + - "3100:8080" + environment: + OLLAMA_BASE_URLS: http://qwen3-coder:11434;http://qwen3:11434 + WEBUI_AUTH: "True" + volumes: + - open_webui_data:/app/backend/data + networks: + - red-principal + +volumes: + open_webui_data: + name: open-webui_open_webui_data + external: true + +networks: + red-principal: + external: true \ No newline at end of file diff --git a/compose/portainer-agent-service.yaml b/compose/portainer-agent-service.yaml index aa08434..b7d3879 100644 --- a/compose/portainer-agent-service.yaml +++ b/compose/portainer-agent-service.yaml @@ -4,7 +4,7 @@ services: portainer-agent: image: portainer/agent:latest container_name: portainer-agent - restart: always + restart: "no" network_mode: bridge ports: - "9001:9001" diff --git a/compose/qwen3-coder-service.yaml b/compose/qwen3-coder-service.yaml new file mode 100644 index 0000000..bafcd5b --- /dev/null +++ b/compose/qwen3-coder-service.yaml @@ -0,0 +1,47 @@ +name: qwen3-coder + +services: + qwen3-coder: + image: ollama/ollama:latest + container_name: qwen3-coder + restart: "no" + ports: + - "0.0.0.0:11434:11434" + environment: + OLLAMA_HOST: 0.0.0.0:11434 + OLLAMA_KEEP_ALIVE: 24h + cpus: "4.0" + mem_limit: 16g + memswap_limit: 20g + shm_size: 1g + volumes: + - qwen3_coder_models:/root/.ollama + networks: + - red-principal + + qwen3-coder-init: + image: ollama/ollama:latest + container_name: qwen3-coder_init + restart: "no" + entrypoint: + - /bin/sh + - -c + - until ollama list >/dev/null 2>&1; do echo 'Esperando al servidor de Qwen3-Coder...'; sleep 5; done; ollama pull "$${QWEN3_CODER_MODEL}" + depends_on: + - qwen3-coder + environment: + OLLAMA_HOST: http://qwen3-coder:11434 + QWEN3_CODER_MODEL: ${QWEN3_CODER_MODEL:-qwen3-coder:latest} + volumes: + - qwen3_coder_models:/root/.ollama + networks: + - red-principal + +volumes: + qwen3_coder_models: + name: qwen3_coder_models + external: true + +networks: + red-principal: + external: true diff --git a/compose/qwen3-service.yaml b/compose/qwen3-service.yaml new file mode 100644 index 0000000..4ec3713 --- /dev/null +++ b/compose/qwen3-service.yaml @@ -0,0 +1,47 @@ +name: qwen3 + +services: + qwen3: + image: ollama/ollama:latest + container_name: qwen3 + restart: "no" + ports: + - "0.0.0.0:11435:11434" + environment: + OLLAMA_HOST: 0.0.0.0:11434 + OLLAMA_KEEP_ALIVE: 24h + cpus: "4.0" + mem_limit: 16g + memswap_limit: 20g + shm_size: 1g + volumes: + - qwen3_models:/root/.ollama + networks: + - red-principal + + qwen3-init: + image: ollama/ollama:latest + container_name: qwen3_init + restart: "no" + entrypoint: + - /bin/sh + - -c + - until ollama list >/dev/null 2>&1; do echo 'Esperando al servidor de Qwen3...'; sleep 5; done; ollama pull "$${QWEN3_MODEL}" + depends_on: + - qwen3 + environment: + OLLAMA_HOST: http://qwen3:11434 + QWEN3_MODEL: ${QWEN3_MODEL:-qwen3:latest} + volumes: + - qwen3_models:/root/.ollama + networks: + - red-principal + +volumes: + qwen3_models: + name: qwen3_models + external: true + +networks: + red-principal: + external: true \ No newline at end of file diff --git a/config/librechat.yaml b/config/librechat.yaml new file mode 100644 index 0000000..0cf289f --- /dev/null +++ b/config/librechat.yaml @@ -0,0 +1,46 @@ +version: 1.3.11 +cache: true + +interface: + customWelcome: "LibreChat local sobre Ollama" + modelSelect: true + parameters: true + prompts: + use: true + create: true + share: false + public: false + +endpoints: + custom: + - name: "ollama-coder" + apiKey: "ollama-local" + baseURL: "http://qwen3-coder:11434/v1" + models: + default: + - "qwen3-coder:latest" + fetch: true + titleConvo: true + titleModel: "current_model" + modelDisplayLabel: "Ollama Coder" + dropParams: + - "stop" + - "user" + + - name: "ollama-general" + apiKey: "ollama-local" + baseURL: "http://qwen3:11434/v1" + models: + default: + - "qwen3:latest" + fetch: true + titleConvo: true + titleModel: "current_model" + modelDisplayLabel: "Ollama General" + dropParams: + - "stop" + - "user" + + allowedAddresses: + - "qwen3-coder:11434" + - "qwen3:11434" diff --git a/env/librechat-service.env b/env/librechat-service.env new file mode 100644 index 0000000..d4a10fd --- /dev/null +++ b/env/librechat-service.env @@ -0,0 +1,30 @@ +HOST=0.0.0.0 +PORT=3200 +DOMAIN_CLIENT=http://localhost:3200 +DOMAIN_SERVER=http://localhost:3200 + +MONGO_URI=mongodb://mongodb:27017/LibreChat +NO_INDEX=true + +MEILI_NO_ANALYTICS=true +MEILI_HOST=http://meilisearch:7700 +MEILI_MASTER_KEY=change_me_meili_master_key + +RAG_PORT=8000 +RAG_API_URL=http://rag_api:8000 + +ALLOW_EMAIL_LOGIN=true +ALLOW_REGISTRATION=true +ALLOW_SOCIAL_LOGIN=false +ALLOW_SOCIAL_REGISTRATION=false +ALLOW_PASSWORD_RESET=false +ALLOW_UNVERIFIED_EMAIL_LOGIN=true +SESSION_COOKIE_SECURE=false + +JWT_SECRET=change_me_jwt_secret_please_replace +JWT_REFRESH_SECRET=change_me_jwt_refresh_secret_please_replace +CREDS_KEY=change_me_creds_key_please_replace +CREDS_IV=change_me_creds_iv_please_replace + +ENDPOINTS=custom +APP_TITLE=LibreChat diff --git a/estructura.txt b/estructura.txt index 8247df9..011a6df 100644 --- a/estructura.txt +++ b/estructura.txt @@ -16,6 +16,10 @@ docker-services/ | mysql-service.yaml | n8n-service.yaml | nodered-service.yaml +| open-webui-service.yaml +| librechat-service.yaml +| qwen3-coder-service.yaml +| qwen3-service.yaml | postgresql-service.yaml | +---env/ @@ -25,9 +29,11 @@ docker-services/ | mysql-service.env | n8n-service.env | nodered-service.env +| librechat-service.env | +---config/ | .env +| librechat.yaml | +---audit/ +---files/