Fix: Logs visibles en consola Docker y ruta correcta /app/data/logs para volumen persistente (#8)
This commit is contained in:
98
casaos.yaml
98
casaos.yaml
@@ -7,7 +7,12 @@ services:
|
|||||||
deploy:
|
deploy:
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
memory: 15922M
|
memory: 512M
|
||||||
|
reservations:
|
||||||
|
devices: []
|
||||||
|
dns:
|
||||||
|
- 8.8.8.8
|
||||||
|
- 1.1.1.1
|
||||||
environment:
|
environment:
|
||||||
- ADMIN_PASSWORD=MiPo6425@@
|
- ADMIN_PASSWORD=MiPo6425@@
|
||||||
- ADMIN_USERNAME=nickpons666
|
- ADMIN_USERNAME=nickpons666
|
||||||
@@ -23,93 +28,18 @@ services:
|
|||||||
- TELEGRAM_TOKEN=8469229183:AAEVIV5e7rjDXKNgFTX0dnCW6JWB88X4p2I
|
- TELEGRAM_TOKEN=8469229183:AAEVIV5e7rjDXKNgFTX0dnCW6JWB88X4p2I
|
||||||
- WEB_HOST=0.0.0.0
|
- WEB_HOST=0.0.0.0
|
||||||
- WEB_PORT=8000
|
- WEB_PORT=8000
|
||||||
|
- PYTHONDONTWRITEBYTECODE=1
|
||||||
|
- PYTHONOPTIMIZE=1
|
||||||
|
- TZ=America/Mexico_City
|
||||||
|
- REDIS_HOST=10.10.4.17
|
||||||
|
- REDIS_PORT=6379
|
||||||
|
- REDIS_PASSWORD=translation_redis_secret
|
||||||
|
- REDIS_DB=0
|
||||||
hostname: bots-translation
|
hostname: bots-translation
|
||||||
image: registry-pons.duckdns.org/bots-translation:v1
|
image: registry-pons.duckdns.org/bots-translation:latest
|
||||||
dns:
|
|
||||||
- 8.8.8.8
|
|
||||||
- 1.1.1.1
|
|
||||||
labels:
|
labels:
|
||||||
icon: https://www.ruthlessreviews.com/wp-content/uploads/2025/12/last-war-image.jpg
|
icon: https://www.ruthlessreviews.com/wp-content/uploads/2025/12/last-war-image.jpg
|
||||||
ports:
|
ports:
|
||||||
- target: 8000
|
- target: 8000
|
||||||
published: "8091"
|
published: "8091"
|
||||||
protocol: tcp
|
protocol: tcp
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- type: bind
|
|
||||||
source: /DATA/AppData/bots-translation/data
|
|
||||||
target: /app/data
|
|
||||||
- type: bind
|
|
||||||
source: /DATA/AppData/bots-translation/data/logs
|
|
||||||
target: /app/data/logs
|
|
||||||
x-casaos:
|
|
||||||
envs:
|
|
||||||
- container: DISCORD_TOKEN
|
|
||||||
description:
|
|
||||||
en_us: Token del bot de Discord
|
|
||||||
- container: TELEGRAM_TOKEN
|
|
||||||
description:
|
|
||||||
en_us: Token del bot de Telegram
|
|
||||||
- container: LIBRETRANSLATE_URL
|
|
||||||
description:
|
|
||||||
en_us: URL de LibreTranslate
|
|
||||||
- container: ADMIN_USERNAME
|
|
||||||
description:
|
|
||||||
en_us: Usuario admin del panel
|
|
||||||
- container: ADMIN_PASSWORD
|
|
||||||
description:
|
|
||||||
en_us: Contraseña admin del panel
|
|
||||||
- container: DB_TYPE
|
|
||||||
description:
|
|
||||||
en_us: Tipo de base de datos (sqlite/mysql)
|
|
||||||
- container: DB_HOST
|
|
||||||
description:
|
|
||||||
en_us: Host de MySQL
|
|
||||||
- container: DB_PORT
|
|
||||||
description:
|
|
||||||
en_us: Puerto de MySQL
|
|
||||||
- container: DB_USER
|
|
||||||
description:
|
|
||||||
en_us: Usuario de MySQL
|
|
||||||
- container: DB_PASSWORD
|
|
||||||
description:
|
|
||||||
en_us: Contraseña de MySQL
|
|
||||||
- container: DB_NAME
|
|
||||||
description:
|
|
||||||
en_us: Nombre de la base de datos MySQL
|
|
||||||
- container: DATABASE_PATH
|
|
||||||
description:
|
|
||||||
en_us: Ruta de la base de datos SQLite (si DB_TYPE=sqlite)
|
|
||||||
ports:
|
|
||||||
- container: "8000"
|
|
||||||
description:
|
|
||||||
en_us: Puerto del panel web
|
|
||||||
volumes:
|
|
||||||
- container: /app/data
|
|
||||||
description:
|
|
||||||
en_us: Datos de los bots y base de datos
|
|
||||||
devices: []
|
|
||||||
cap_add: []
|
|
||||||
network_mode: bridge
|
|
||||||
privileged: false
|
|
||||||
x-casaos:
|
|
||||||
architectures:
|
|
||||||
- amd64
|
|
||||||
author: nickpons666
|
|
||||||
category: Utility
|
|
||||||
description:
|
|
||||||
en_us: Bots de traducción para Discord y Telegram con panel web
|
|
||||||
developer: nickpons666
|
|
||||||
hostname: ""
|
|
||||||
icon: https://www.ruthlessreviews.com/wp-content/uploads/2025/12/last-war-image.jpg
|
|
||||||
index: /
|
|
||||||
is_uncontrolled: false
|
|
||||||
main: bots-translation
|
|
||||||
port_map: "8091"
|
|
||||||
scheme: http
|
|
||||||
store_app_id: bots-translation
|
|
||||||
tagline:
|
|
||||||
en_us: Bots de Traducción
|
|
||||||
title:
|
|
||||||
custom: ""
|
|
||||||
en_us: Bots de Traducción
|
|
||||||
|
|||||||
@@ -37,13 +37,29 @@ def start_process(cmd, name, delay_before=0):
|
|||||||
log(f"✅ Iniciando {name}...")
|
log(f"✅ Iniciando {name}...")
|
||||||
|
|
||||||
log_path = f"{LOG_DIR}/{name.lower().replace(' ', '_')}.log"
|
log_path = f"{LOG_DIR}/{name.lower().replace(' ', '_')}.log"
|
||||||
with open(log_path, "a") as f:
|
log_fd = open(log_path, "a")
|
||||||
p = subprocess.Popen(
|
|
||||||
cmd,
|
# stdout va al archivo Y a la consola del contenedor (Docker logs)
|
||||||
stdout=f,
|
p = subprocess.Popen(
|
||||||
stderr=subprocess.STDOUT,
|
cmd,
|
||||||
preexec_fn=os.setsid
|
stdout=subprocess.PIPE,
|
||||||
)
|
stderr=subprocess.STDOUT,
|
||||||
|
preexec_fn=os.setsid
|
||||||
|
)
|
||||||
|
|
||||||
|
# Hilo que redirige la salida del proceso al archivo + consola
|
||||||
|
import threading
|
||||||
|
def tee_output(proc, fd, label):
|
||||||
|
for line in iter(proc.stdout.readline, b''):
|
||||||
|
decoded = line.decode("utf-8", errors="replace")
|
||||||
|
fd.write(decoded)
|
||||||
|
fd.flush()
|
||||||
|
print(f"[{label}] {decoded}", end="", flush=True)
|
||||||
|
fd.close()
|
||||||
|
|
||||||
|
t = threading.Thread(target=tee_output, args=(p, log_fd, name), daemon=True)
|
||||||
|
t.start()
|
||||||
|
|
||||||
processes.append((p, name))
|
processes.append((p, name))
|
||||||
return p
|
return p
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,10 @@ import logging
|
|||||||
import os
|
import os
|
||||||
from logging.handlers import TimedRotatingFileHandler
|
from logging.handlers import TimedRotatingFileHandler
|
||||||
|
|
||||||
# Directorio base para almacenar los logs
|
# Directorio base para almacenar los logs (respeta el volumen de Docker /app/data)
|
||||||
LOG_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "logs")
|
_DEFAULT_LOG_DIR = "/app/data/logs"
|
||||||
|
_LOCAL_LOG_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "logs")
|
||||||
|
LOG_DIR = _DEFAULT_LOG_DIR if os.path.exists("/app/data") else _LOCAL_LOG_DIR
|
||||||
os.makedirs(LOG_DIR, exist_ok=True)
|
os.makedirs(LOG_DIR, exist_ok=True)
|
||||||
|
|
||||||
def _create_logger(name: str, filename: str, level=logging.INFO) -> logging.Logger:
|
def _create_logger(name: str, filename: str, level=logging.INFO) -> logging.Logger:
|
||||||
|
|||||||
Reference in New Issue
Block a user