# Ejecutar desde la raíz del proyecto: docker compose up --build # # Creá `.env` desde `.env.example` y usá DB_HOST=moduxdb para el servicio MySQL de abajo. services: modux-backend: build: context: ./backend dockerfile: docker/Dockerfile container_name: moduxbackend ports: - "8077:80" volumes: - ./backend:/var/www/html environment: DB_HOST: moduxdb DB_PORT: '3306' DB_NAME: modux DB_USER: modux DB_PASS: modux networks: - app-network depends_on: - moduxdb # SPA (React + CoreUI) en MODO DESARROLLO: Vite dev server con hot-reload (HMR). # El código se monta por bind-mount, así los cambios se ven al instante SIN buildear. # Se sirve en http://localhost:5173 (o la IP del host, p.ej. Tailscale) y consume la # API en el mismo host, puerto 8077: si VITE_API_URL no está seteada (var de shell, # ver ${VITE_API_URL:-}), client.ts la deriva de window.location.hostname (así # funciona igual por localhost, 127.0.0.1 o la IP tailscale). Setear VITE_API_URL # explícito (p.ej. para exponer por Tailscale Funnel en otro puerto/protocolo). # Para producción usar docker-compose.prod.yml (build estático servido por nginx). frontend: image: node:20-alpine container_name: moduxfrontend working_dir: /app # Instala dependencias (rápido si ya están) y levanta Vite accesible desde el host. command: sh -c "npm install && npm run dev" environment: VITE_API_URL: ${VITE_API_URL:-} volumes: - ./frontend:/app - frontend_node_modules:/app/node_modules ports: - "5173:5173" networks: - app-network depends_on: - modux-backend # Bot Playwright que automatiza el Portal IVA de ARCA — es lo que atiende el botón # "Liquidar IVA" de la UI. Servicio manual, para login inicial de un CUIT o una corrida # puntual (`docker compose run --rm extractor npm run traer -- --periodo 07/2026`); no # tiene restart policy porque no es un proceso de larga duración (eso es # `extractor-worker`, abajo). Requiere `extractor/.env` configurado (ver extractor/README.md). extractor: build: ./extractor env_file: - ./extractor/.env environment: # Corriendo en esta red Docker, "localhost" es el contenedor mismo, no el backend. ECOSISTEMA_BASE_URL: http://modux-backend:80 volumes: - ./extractor/.sessions:/app/.sessions - ./extractor/salida:/app/salida - ./extractor/debug:/app/debug networks: - app-network # Parte del ecosistema, siempre prendido: hace polling a # GET /iva/liquidaciones/pendientes y ejecuta cada pedido solo, sin intervención manual — # es lo que hace que el botón "Liquidar IVA" de la UI funcione en cualquier momento. # Reusa la imagen y la sesión de ARCA de `extractor`. Requiere que el CUIT que se va a # liquidar ya tenga una sesión bootstrapeada al menos una vez (ver extractor/README.md). extractor-worker: build: ./extractor env_file: - ./extractor/.env environment: ECOSISTEMA_BASE_URL: http://modux-backend:80 volumes: - ./extractor/.sessions:/app/.sessions - ./extractor/debug:/app/debug command: npm run worker restart: unless-stopped networks: - app-network depends_on: - modux-backend moduxdb: image: mysql:8.0 container_name: moduxdb environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: modux MYSQL_USER: modux MYSQL_PASSWORD: modux ports: - "3308:3306" volumes: - db_data:/var/lib/mysql networks: - app-network networks: app-network: driver: bridge volumes: # Apuntan explícitamente a los volúmenes físicos ya existentes, así el nombre no cambia si # este compose se levanta standalone o incluido desde la raíz (docker-compose.yml de # /data/proyectos/cynchro/sistemaContable, que orquesta todo el ecosistema). db_data: external: true name: ecosistema_db_data frontend_node_modules: external: true name: ecosistema_frontend_node_modules