ecom-store/scripts/docker-compose.m5.yml
Iris Florencio 9c2f7ff7b4 chore: triagem de arquivos untracked (60+ → 0)
Adiciona ao repo os scripts e configs reais do motor que estavam fora do git,
e remove arquivos legados/abandonados.

Adicionados (30):
- scripts/docker-compose.m5.yml, openwa-compose.yml, minio-compose.yml
- scripts/openwa.env (sem secrets)
- scripts/{entrypoint,saleor-entrypoint,saleor-start}.sh
- scripts/{chatwoot-setup,compliance-check,health-check,resumo-diario}.sh
- scripts/{insert_workflow,telegram_user_login,telegram_user_monitor}.py
- scripts/requirements.txt
- scripts/traefik-conf/{traefik.yml,dynamic-config.yml}
- scripts/compliance/, scripts/calculators/, scripts/backups/
- scripts/{README.md,README-INSTALL.md,WHATSAPP-SETUP.md,.gitignore}
- .gitignore (atualizado)

Removidos (ja' em backup/untracked-lixo-2026-07-06/):
- agents/, crm/, hermes_skills_backup/, api-complive/, docs/ (legados)
- scripts/{wrapper.py,wrapper.sh}
- scripts/docker-compose.m5.yml.backup, traefik-conf/routes.yml.bak2
- scripts/saleor-media/RSA_*.{bak,old_*}
- scripts/n8n-workflows/webhook-saleor.json.bak2
- scripts/backups/20260622_0300/saleor_db.sql
- integracao_completa.sh, monitoramento_vps.sh
- ruvector.db (vazio)

Ignorados via .gitignore:
- vault/ (Obsidian KB)
- skills/ (duplicado de ~/.hermes/skills/)
- scripts/{saleor-media,traefik-acme,yt-pub-livesx,minio,n8n-workflows,skills}/
- scripts/backups/2026*_*/
2026-07-06 18:50:26 -03:00

305 lines
11 KiB
YAML

# docker-compose.m5.yml — Motor Ecommerce M5 Brasil
# Versão atualizada conforme manual Saleor 3.23
services:
# ── Traefik (Proxy Reverso) ─────────────────────────
traefik:
image: traefik:v3.0
container_name: m5_traefik
restart: unless-stopped
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --certificatesresolvers.myresolver.acme.httpchallenge=true
- --certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web
- --certificatesresolvers.myresolver.acme.email=irisflorencio@yahoo.com.br
- --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json
ports:
- "80:80"
- "443:443"
- "8090:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- traefik-acme:/letsencrypt
- ./traefik-conf/traefik.yml:/etc/traefik/traefik.yml:ro
- ./traefik-conf/routes.yml:/etc/traefik/routes.yml:ro
- /etc/letsencrypt:/certs:ro
- ./traefik-conf/traefik.yml:/etc/traefik/traefik.yml:ro
- ./traefik-conf/routes.yml:/etc/traefik/routes.yml:ro
- /etc/letsencrypt:/certs:ro
networks:
- m5_network
labels:
- "traefik.enable=false"
# ── Banco de dados principal ──────────────────────────
postgres:
image: postgres:16-alpine
container_name: m5_postgres
restart: unless-stopped
environment:
POSTGRES_DB: ${POSTGRES_DB:-m5ecommerce}
POSTGRES_USER: ${POSTGRES_USER:-m5user}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- m5_network
labels:
- "traefik.enable=false"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-m5user}"]
interval: 10s
timeout: 5s
retries: 5
# ── Cache / Session ──────────────────────────────────
redis:
image: redis:7-alpine
container_name: m5_redis
restart: unless-stopped
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
volumes:
- redis_data:/data
networks:
- m5_network
labels:
- "traefik.enable=false"
healthcheck:
test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
interval: 10s
timeout: 3s
retries: 5
# ── Saleor API ───────────────────────────────────────
saleor:
image: ghcr.io/saleor/saleor:3.23
container_name: m5_saleor
restart: unless-stopped
entrypoint: ["/app/entrypoint.sh"]
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
labels:
- "traefik.enable=true"
- "traefik.http.routers.saleor-api.rule=Host(`loja.m5digital.net.br`)"
- "traefik.http.routers.saleor-api.entrypoints=websecure"
- "traefik.http.routers.saleor-api.tls=true"
- "traefik.http.services.saleor-api.loadbalancer.server.port=8000"
environment:
- DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-m5ecommerce}
- REDIS_URL=redis://:${REDIS_PASSWORD}@redis:6379
- CELERY_BROKER_URL=redis://:${REDIS_PASSWORD}@redis:6379/0
- SECRET_KEY=${SALEOR_SECRET_KEY}
- ALLOWED_HOSTS=loja.m5digital.net.br,localhost,127.0.0.1,dashboard.m5digital.net.br
- ALLOWED_GRAPHQL_ORIGINS=https://dashboard.m5digital.net.br,https://loja.m5digital.net.br,http://localhost:3000
- DEFAULT_MAIL_FROM=${DEFAULT_EMAIL_FROM}
- EMAIL_URL=${EMAIL_URL}
- RSA_PRIVATE_KEY=/app/media/RSA_PRIVATE_KEY.pem
- STRIPE_API_KEY=${STRIPE_API_KEY}
- STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET}
- MERCADOPAGO_ACCESS_TOKEN=${MERCADOPAGO_ACCESS_TOKEN}
- MERCADOPAGO_WEBHOOK_SECRET=${MERCADOPAGO_WEBHOOK_SECRET}
volumes:
- ./saleor-media:/app/media
- ./entrypoint.sh:/app/entrypoint.sh:ro
networks:
- m5_network
# ── Saleor Worker (Celery) ─────────────────────────
worker:
image: ghcr.io/saleor/saleor:3.23
container_name: m5_saleor_worker
restart: unless-stopped
command: celery -A saleor worker --loglevel=info
depends_on:
- postgres
- redis
environment:
- DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-m5ecommerce}
- REDIS_URL=redis://:${REDIS_PASSWORD}@redis:6379
- CELERY_BROKER_URL=redis://:${REDIS_PASSWORD}@redis:6379/0
- SECRET_KEY=${SALEOR_SECRET_KEY}
volumes:
- saleor-media:/app/media
networks:
- m5_network
labels:
- "traefik.enable=false"
# ── Saleor Dashboard ─────────────────────────────────
saleor-dashboard:
image: ghcr.io/saleor/saleor-dashboard:latest
container_name: m5_saleor_dashboard
restart: unless-stopped
environment:
- API_URL=https://loja.m5digital.net.br/graphql/
- APP_MOUNT_URI=/
- NODE_ENV=production
networks:
- m5_network
labels:
- "traefik.enable=true"
- "traefik.http.routers.saleor-dash.rule=Host(`dashboard.m5digital.net.br`)"
- "traefik.http.routers.saleor-dash.entrypoints=websecure"
- "traefik.http.routers.saleor-dash.tls=true"
- "traefik.http.services.saleor-dash.loadbalancer.server.port=80"
# ── n8n (Automação) ──────────────────────────────────
n8n:
image: n8nio/n8n:${N8N_VERSION:-1.70}
container_name: m5_n8n
restart: unless-stopped
depends_on:
- postgres
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${N8N_DB:-n8n}
- DB_POSTGRESDB_USER=${POSTGRES_USER:-m5user}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=${N8N_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_PASSWORD}
- N8N_HOST=https://n8n.m5digital.net.br
- WEBHOOK_URL=https://n8n.m5digital.net.br/
- N8N_PROTOCOL=https
- N8N_TRUST_PROXY=true
- GENERIC_TIMEZONE=America/Sao_Paulo
- WA_AUTOCARRIER_URL=http://m5_openwa:8080
- SALEOR_API_URL=https://loja.m5digital.net.br/graphql/
volumes:
- n8n_data:/home/node/.n8n
- ./n8n-workflows:/workflows
networks:
- m5_network
labels:
- "traefik.enable=true"
- "traefik.http.routers.n8n.rule=Host(`n8n.m5digital.net.br`)"
- "traefik.http.routers.n8n.entrypoints=websecure"
- "traefik.http.routers.n8n.tls=true"
- "traefik.http.services.n8n.loadbalancer.server.port=5678"
# ── OpenWA (WhatsApp) ────────────────────────────────
openwa:
image: ghcr.io/rmyndharis/openwa:latest
container_name: m5_openwa
restart: unless-stopped
environment:
- PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
- PUPPETEER_EXECUTABLE_PATH=/opt/google/chrome/chrome
- CHROME_PATH=/opt/google/chrome/chrome
- WA_CHROMIUM_FLAGS=--no-sandbox --disable-setuid-sandbox --disable-dev-shm-usage --disable-gpu --disable-software-rasterizer --no-zygote --single-process
- WA_USE_CHROME=true
- MULTI_DEVICE=true
- READ_MESSAGES=true
- GROUP_PARTICIPANTS=true
- WEBHOOK_URL=${WA_WEBHOOK_URL:-https://n8n.m5digital.net.br/webhook/wa}
env_file:
- ./openwa.env
ports:
- "2785:2785"
- "8080:8080"
- "8081:8081"
- "8002:8002"
volumes:
- openwa_data:/var/lib/wa-automate
- ./openwa-sessions:/sessions
networks:
- m5_network
security_opt:
- seccomp=unconfined
labels:
- "traefik.enable=true"
- "traefik.http.routers.openwa.rule=Host(`wa.m5digital.net.br`)"
- "traefik.http.routers.openwa.entrypoints=websecure"
- "traefik.http.routers.openwa.tls=true"
- "traefik.http.services.openwa.loadbalancer.server.port=2785"
# ── Gitea (Git) ─────────────────────────────────────
gitea:
image: gitea/gitea:${GITEA_VERSION:-1.22}
container_name: m5_gitea
restart: unless-stopped
ports:
- "2222:22"
depends_on:
- postgres
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=postgres
- GITEA__database__HOST=postgres:5432
- GITEA__database__NAME=${GITEA_DB:-gitea}
- GITEA__database__USER=${POSTGRES_USER:-m5user}
- GITEA__database__PASSWD=${POSTGRES_PASSWORD}
- GITEA__server__PROTOCOL=http
- GITEA__server__ROOT_URL=https://git.m5digital.net.br/
- GITEA__server__DOMAIN=git.m5digital.net.br
- GITEA__security__INSTALL_LOCK=true
- GITEA__service__DISABLE_REGISTRATION=false
volumes:
- gitea_data:/data
- ./gitea-repos:/git/repositories
networks:
- m5_network
labels:
- "traefik.enable=true"
- "traefik.http.routers.gitea.rule=Host(`git.m5digital.net.br`)"
- "traefik.http.routers.gitea.entrypoints=websecure"
- "traefik.http.routers.gitea.tls=true"
- "traefik.http.services.gitea.loadbalancer.server.port=3000"
# ── yt-pub-livesx ──────────────────────────────────
yt-pub-livesx-dashboard:
image: yt-pub-livesx-dashboard
container_name: yt-pub-livesx-dashboard-1
restart: unless-stopped
environment:
- TZ=America/Sao_Paulo
ports:
- "8091:8091"
volumes:
- ./yt-pub-livesx/data:/app/data
- ./yt-pub-livesx/credentials.enc:/app/credentials.enc:ro
networks:
- m5_network
labels:
- "traefik.enable=true"
- "traefik.http.routers.video.rule=Host(`video.m5digital.net.br`)"
- "traefik.http.routers.video.entrypoints=websecure"
- "traefik.http.routers.video.tls=true"
- "traefik.http.services.video.loadbalancer.server.port=8091"
yt-pub-livesx-scheduler:
image: yt-pub-livesx-scheduler
container_name: yt-pub-livesx-scheduler-1
restart: unless-stopped
environment:
- TZ=America/Sao_Paulo
volumes:
- ./yt-pub-livesx/data:/app/data
- ./yt-pub-livesx/credentials.enc:/app/credentials.enc:ro
networks:
- m5_network
networks:
m5_network:
name: scripts_m5_network
external: true
volumes:
postgres_data:
redis_data:
saleor-media:
gitea_data:
n8n_data:
openwa_data:
traefik-acme: