--- type: Entity layer: wiki tags: [stack, dashdescomplicar, infra, docker, easypanel, deploy] title: "Docker-Deploy" --- # Docker-Deploy Pipeline de containerização e deploy do DashDescomplicar via Docker + EasyPanel Swarm no servidor `easy` (VM 101, Proxmox). ## Responsabilidades - **Build**: Imagem Docker multi-stage (`node:22-alpine`) com `npm ci` + build TypeScript - **Deploy**: `docker service update --force` no EasyPanel Swarm - **Runtime**: Node.js 22 Alpine, porta 3001, `NODE_ENV=production` - **Static Serving**: Express serve o bundle Vite (`dist/`) em produção - **Health**: `curl -sf https://dash.descomplicar.pt/api/health` ## Stack - **Dockerfile**: 26 linhas, `node:22-alpine` - **Build**: `tsc -b && vite build && tsc -p api/tsconfig.json` - **Start**: `node api/dist/server.js` (compilado TS → JS) - **Procfile**: `web: node api/dist/server.js` (EasyPanel) - **Repo**: Gitea (`git.descomplicar.pt/ealmeida/DashDescomplicar`) ## Pipeline de Deploy 1. **Validar build local**: `npx tsc -b && npx vite build && npx tsc -p api/tsconfig.json` 2. **Push Gitea**: `git push origin main` (HTTPS, owner `ealmeida`) 3. **SSH easy**: `docker build -t easypanel/descomplicar/dashboard_descomplicar:latest .` 4. **Redeploy**: `docker service update --force descomplicar_dashboard_descomplicar` 5. **Verificar**: `curl -sf https://dash.descomplicar.pt/api/dashboard` ## Variáveis de Ambiente (Container) ``` DB_HOST=176.9.3.158 DB_USER=... DB_PASS=... DB_NAME=... WP_MONITOR_API_KEY=... HETZNER_TOKEN=... N8N_API_KEY=... BESZEL_URL=... BESZEL_EMAIL=... BESZEL_PASSWORD=... EASY_HOST=5.9.90.70 EASY_USER=root EASY_PASS=... MCP_GATEWAY_URL=https://gateway.descomplicar.pt OBSERVABILIDADE_DB=/data/sessions.db NODE_ENV=production API_PORT=3001 FRONTEND_URL=https://dash.descomplicar.pt ``` ## Volumes - `/root/data/dashboard-descomplicar/sessions.db:/data/sessions.db` (SQLite sessions) ## Localizações - **Dockerfile**: `Dev/DashDescomplicar/Dockerfile` - **Procfile**: `Dev/DashDescomplicar/Procfile` - **Código no servidor**: `/etc/easypanel/projects/descomplicar/dashboard_descomplicar/code/` - **Deploy**: `dash.descomplicar.pt` (EasyPanel Swarm, Traefik reverse proxy) ## Dependências - **Gitea**: Push de código (`git.descomplicar.pt/ealmeida/DashDescomplicar`) - **EasyPanel Server**: SSH (`5.9.90.70:22`, user `root`, password auth) - **Express-API**: Servidor Node.js dentro do container - **MySQL-Pool**: Conexão ao CWP (`176.9.3.158:3306`) ## Notas Operacionais - EasyPanel MCP (`redeploy_service`) está quebrado — usar SEMPRE SSH directo - Pre-commit hook (`Regra #47`): `npm audit --audit-level=moderate` - `.env` no `.gitignore` — nunca commitar credenciais