From afe0eff17528940a19023cc3e4d6e05d48810af9 Mon Sep 17 00:00:00 2001 From: Guilherme Gomes Date: Fri, 17 Apr 2026 16:49:24 -0300 Subject: [PATCH 1/3] feat: enforce required keys in admin channel form and kill port conflicts on start Submodule bumps: - evo-ai-crm-community: IntegrationRequirements module + controller and spec changes for required-key enforcement and hasXxxConfig booleans. - evo-ai-frontend-community: ChannelConfig required validation + inline error banner, GlobalConfig cache invalidation on save, FB SDK loading and gating fixes. Makefile: - `make start` and `make restart` now run a `free-ports` step that stops containers from other compose projects holding any port this stack publishes, so the environment comes up in one command on a dev workstation without manual cleanup. --- Makefile | 23 ++++++++++++++++++++--- evo-ai-crm-community | 2 +- evo-ai-frontend-community | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 3c7c73f..01ce962 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ GREEN := \033[32m RESET := \033[0m .PHONY: help setup start stop restart logs clean build status \ - seed seed-auth seed-crm \ + seed seed-auth seed-crm free-ports \ shell-auth shell-crm shell-core shell-processor shell-bot-runtime ## —— General —————————————————————————————————————————————————————————————————— @@ -64,16 +64,33 @@ setup: ## First-time setup: copy env, build, start, seed @echo " Pass: Password@123" @echo "" -start: ## Start all services +start: free-ports ## Start all services (frees conflicting ports first) docker compose up -d stop: ## Stop all services docker compose down -restart: ## Restart all services +restart: free-ports ## Restart all services (frees conflicting ports first) docker compose down docker compose up -d +free-ports: ## Stop any docker containers from other stacks holding our published ports + @project=$$(docker compose config 2>/dev/null | awk '/^name:/ {print $$2; exit}'); \ + ports=$$(docker compose config 2>/dev/null | awk '/^[[:space:]]+published:/ {gsub(/"/,"",$$2); print $$2}' | sort -u); \ + freed=0; \ + for port in $$ports; do \ + for cid in $$(docker ps --filter "publish=$$port" -q 2>/dev/null); do \ + cproj=$$(docker inspect -f '{{ index .Config.Labels "com.docker.compose.project" }}' $$cid 2>/dev/null); \ + if [ "$$cproj" != "$$project" ]; then \ + name=$$(docker inspect -f '{{.Name}}' $$cid 2>/dev/null | sed 's|^/||'); \ + echo " stopping $$name (port $$port, project=$${cproj:-})"; \ + docker stop $$cid >/dev/null; \ + freed=$$((freed + 1)); \ + fi; \ + done; \ + done; \ + if [ $$freed -gt 0 ]; then echo "$(GREEN)Freed $$freed container(s).$(RESET)"; fi + build: ## Rebuild all service images (no cache) docker compose build --no-cache diff --git a/evo-ai-crm-community b/evo-ai-crm-community index be18d1b..833bcd9 160000 --- a/evo-ai-crm-community +++ b/evo-ai-crm-community @@ -1 +1 @@ -Subproject commit be18d1b8ca58efb2d04de3a95c109e879301a6c0 +Subproject commit 833bcd9e3d812458ee74007a052d97d541829f0c diff --git a/evo-ai-frontend-community b/evo-ai-frontend-community index 6c2cc86..783b538 160000 --- a/evo-ai-frontend-community +++ b/evo-ai-frontend-community @@ -1 +1 @@ -Subproject commit 6c2cc86e164ffc93adf8a177fe87ab8be39a8ab3 +Subproject commit 783b53847917dec8f1fb4b832bad9732702f71c2 From aba73f245fa3e7b3b6fd91ce4e579fbac57ba380 Mon Sep 17 00:00:00 2001 From: Guilherme Gomes Date: Fri, 17 Apr 2026 16:56:36 -0300 Subject: [PATCH 2/3] =?UTF-8?q?revert(makefile):=20drop=20free-ports=20tar?= =?UTF-8?q?get=20=E2=80=94=20belongs=20to=20personal=20dev=20setup,=20not?= =?UTF-8?q?=20shared?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index 01ce962..3c7c73f 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ GREEN := \033[32m RESET := \033[0m .PHONY: help setup start stop restart logs clean build status \ - seed seed-auth seed-crm free-ports \ + seed seed-auth seed-crm \ shell-auth shell-crm shell-core shell-processor shell-bot-runtime ## —— General —————————————————————————————————————————————————————————————————— @@ -64,33 +64,16 @@ setup: ## First-time setup: copy env, build, start, seed @echo " Pass: Password@123" @echo "" -start: free-ports ## Start all services (frees conflicting ports first) +start: ## Start all services docker compose up -d stop: ## Stop all services docker compose down -restart: free-ports ## Restart all services (frees conflicting ports first) +restart: ## Restart all services docker compose down docker compose up -d -free-ports: ## Stop any docker containers from other stacks holding our published ports - @project=$$(docker compose config 2>/dev/null | awk '/^name:/ {print $$2; exit}'); \ - ports=$$(docker compose config 2>/dev/null | awk '/^[[:space:]]+published:/ {gsub(/"/,"",$$2); print $$2}' | sort -u); \ - freed=0; \ - for port in $$ports; do \ - for cid in $$(docker ps --filter "publish=$$port" -q 2>/dev/null); do \ - cproj=$$(docker inspect -f '{{ index .Config.Labels "com.docker.compose.project" }}' $$cid 2>/dev/null); \ - if [ "$$cproj" != "$$project" ]; then \ - name=$$(docker inspect -f '{{.Name}}' $$cid 2>/dev/null | sed 's|^/||'); \ - echo " stopping $$name (port $$port, project=$${cproj:-})"; \ - docker stop $$cid >/dev/null; \ - freed=$$((freed + 1)); \ - fi; \ - done; \ - done; \ - if [ $$freed -gt 0 ]; then echo "$(GREEN)Freed $$freed container(s).$(RESET)"; fi - build: ## Rebuild all service images (no cache) docker compose build --no-cache From 7fd455c42c6bb47228f2a2156f9128c26a9da8ef Mon Sep 17 00:00:00 2001 From: Guilherme Gomes Date: Fri, 17 Apr 2026 18:01:47 -0300 Subject: [PATCH 3/3] ci: seed .env from example before validating docker-compose docker compose config requires every env_file referenced in docker-compose.yml to exist; the CI runner only has .env.example, so copy it to .env before running the validator. --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0c96b0c..422b91b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,6 +13,9 @@ jobs: with: submodules: recursive + - name: Seed .env from example + run: cp .env.example .env + - name: Validate docker-compose.yml run: docker compose config --quiet