diff --git a/.gitea/workflows/build-push-images.yml b/.gitea/workflows/build-push-images.yml new file mode 100644 index 0000000..0e140ea --- /dev/null +++ b/.gitea/workflows/build-push-images.yml @@ -0,0 +1,123 @@ +name: Build and Push Docker Images + +on: + push: + branches: + - main + tags: + - 'v*' + workflow_dispatch: + +env: + REGISTRY: git.automatizase.com.br + REGISTRY_PATH: luis.erlacher/archon + +jobs: + build-and-push: + runs-on: wsl + + strategy: + matrix: + include: + - name: server + context: ./python + dockerfile: ./python/Dockerfile.server + - name: mcp + context: ./python + dockerfile: ./python/Dockerfile.mcp + - name: frontend + context: ./archon-ui-main + dockerfile: ./archon-ui-main/Dockerfile + - name: agents + context: ./python + dockerfile: ./python/Dockerfile.agents + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Gitea Container Registry + run: | + echo "${{ secrets.GITEA_TOKEN }}" | docker login ${{ env.REGISTRY }} -u ${{ secrets.GITEA_USERNAME }} --password-stdin + + - name: Extract version metadata + id: meta + run: | + # Se for uma tag, usa a tag como versão + if [[ "${{ github.ref }}" == refs/tags/* ]]; then + VERSION=${GITHUB_REF#refs/tags/} + else + # Senão, gera versão baseada no número do run + VERSION="v1.0.${{ github.run_number }}" + fi + + COMMIT_SHA="${{ github.sha }}" + SHORT_SHA=${COMMIT_SHA:0:7} + + echo "version=${VERSION}" >> $GITHUB_OUTPUT + echo "short_sha=${SHORT_SHA}" >> $GITHUB_OUTPUT + + - name: Build and push ${{ matrix.name }} image + uses: docker/build-push-action@v5 + with: + context: ${{ matrix.context }} + file: ${{ matrix.dockerfile }} + push: true + tags: | + ${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/${{ matrix.name }}:latest + ${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/${{ matrix.name }}:${{ steps.meta.outputs.version }} + ${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/${{ matrix.name }}:${{ steps.meta.outputs.short_sha }} + cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/${{ matrix.name }}:buildcache + cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/${{ matrix.name }}:buildcache,mode=max + + summary: + needs: build-and-push + runs-on: wsl + + steps: + - name: Extract version metadata + id: meta + run: | + if [[ "${{ github.ref }}" == refs/tags/* ]]; then + VERSION=${GITHUB_REF#refs/tags/} + else + VERSION="v1.0.${{ github.run_number }}" + fi + COMMIT_SHA="${{ github.sha }}" + SHORT_SHA=${COMMIT_SHA:0:7} + echo "version=${VERSION}" >> $GITHUB_OUTPUT + echo "short_sha=${SHORT_SHA}" >> $GITHUB_OUTPUT + + - name: Build Summary + run: | + echo "### 🚀 Docker Images Build & Push Summary" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "**Version:** \`${{ steps.meta.outputs.version }}\`" >> $GITHUB_STEP_SUMMARY + echo "**Commit:** \`${{ steps.meta.outputs.short_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "**Registry:** \`${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "#### 📦 Images Pushed:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| Service | Image | Tags |" >> $GITHUB_STEP_SUMMARY + echo "|---------|-------|------|" >> $GITHUB_STEP_SUMMARY + echo "| Server | \`${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/server\` | \`latest\`, \`${{ steps.meta.outputs.version }}\`, \`${{ steps.meta.outputs.short_sha }}\` |" >> $GITHUB_STEP_SUMMARY + echo "| MCP | \`${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/mcp\` | \`latest\`, \`${{ steps.meta.outputs.version }}\`, \`${{ steps.meta.outputs.short_sha }}\` |" >> $GITHUB_STEP_SUMMARY + echo "| Frontend | \`${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/frontend\` | \`latest\`, \`${{ steps.meta.outputs.version }}\`, \`${{ steps.meta.outputs.short_sha }}\` |" >> $GITHUB_STEP_SUMMARY + echo "| Agents | \`${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/agents\` | \`latest\`, \`${{ steps.meta.outputs.version }}\`, \`${{ steps.meta.outputs.short_sha }}\` |" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "#### 🔧 Docker Compose Usage:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`yaml" >> $GITHUB_STEP_SUMMARY + echo "services:" >> $GITHUB_STEP_SUMMARY + echo " archon-server:" >> $GITHUB_STEP_SUMMARY + echo " image: ${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/server:${{ steps.meta.outputs.version }}" >> $GITHUB_STEP_SUMMARY + echo " archon-mcp:" >> $GITHUB_STEP_SUMMARY + echo " image: ${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/mcp:${{ steps.meta.outputs.version }}" >> $GITHUB_STEP_SUMMARY + echo " archon-frontend:" >> $GITHUB_STEP_SUMMARY + echo " image: ${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/frontend:${{ steps.meta.outputs.version }}" >> $GITHUB_STEP_SUMMARY + echo " archon-agents:" >> $GITHUB_STEP_SUMMARY + echo " image: ${{ env.REGISTRY }}/${{ env.REGISTRY_PATH }}/agents:${{ steps.meta.outputs.version }}" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY diff --git a/REGISTRY.md b/REGISTRY.md new file mode 100644 index 0000000..80e9708 --- /dev/null +++ b/REGISTRY.md @@ -0,0 +1,241 @@ +# Usando Imagens do Registry Gitea + +Este documento descreve como usar as imagens Docker do Archon a partir do registry privado do Gitea. + +## Registry Information + +**Registry URL:** `git.automatizase.com.br` +**Repository:** `luis.erlacher/archon` + +## Imagens Disponíveis + +Todas as imagens são buildadas automaticamente via Gitea Actions e publicadas com múltiplas tags: + +| Serviço | Imagem | Descrição | +|---------|--------|-----------| +| **Server** | `git.automatizase.com.br/luis.erlacher/archon/server` | FastAPI + Crawling + Socket.IO | +| **MCP** | `git.automatizase.com.br/luis.erlacher/archon/mcp` | MCP Server para IDEs | +| **Frontend** | `git.automatizase.com.br/luis.erlacher/archon/frontend` | React UI | +| **Agents** | `git.automatizase.com.br/luis.erlacher/archon/agents` | AI Agents (opcional) | + +## Tags Disponíveis + +Cada imagem é publicada com 3 tags: + +- **`latest`** - Última versão estável da branch main +- **`v1.0.X`** - Versão semântica (X = número do build) +- **`SHORT_SHA`** - Hash curto do commit (7 caracteres) + +### Exemplos: +```bash +git.automatizase.com.br/luis.erlacher/archon/server:latest +git.automatizase.com.br/luis.erlacher/archon/server:v1.0.42 +git.automatizase.com.br/luis.erlacher/archon/server:a3c2f1e +``` + +## Autenticação no Registry + +### 1. Login com Docker + +```bash +docker login git.automatizase.com.br +# Username: luis.erlacher +# Password: [seu token de acesso] +``` + +### 2. Gerar Token de Acesso + +1. Acesse: https://git.automatizase.com.br/user/settings/applications +2. Clique em "Generate New Token" +3. Selecione permissões: `read:package`, `write:package` +4. Use o token gerado como senha no docker login + +## Uso em Docker Compose + +### Opção 1: Usar arquivo fornecido + +```bash +# Copiar arquivo .env de exemplo +cp .env.example .env + +# Editar variáveis de ambiente necessárias +nano .env + +# Subir com imagens do registry +docker compose -f docker-compose.registry.yml up -d + +# Com agents (opcional) +docker compose -f docker-compose.registry.yml --profile agents up -d +``` + +### Opção 2: Criar seu próprio compose + +```yaml +services: + archon-server: + image: git.automatizase.com.br/luis.erlacher/archon/server:v1.0.42 + # ... configurações + + archon-mcp: + image: git.automatizase.com.br/luis.erlacher/archon/mcp:v1.0.42 + # ... configurações + + archon-frontend: + image: git.automatizase.com.br/luis.erlacher/archon/frontend:v1.0.42 + # ... configurações +``` + +## Uso em Kubernetes + +### 1. Criar Secret para Registry + +```bash +kubectl create secret docker-registry gitea-registry \ + --docker-server=git.automatizase.com.br \ + --docker-username=luis.erlacher \ + --docker-password= \ + --docker-email=lperlacher@gmail.com +``` + +### 2. Usar em Deployment + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: archon-server +spec: + template: + spec: + imagePullSecrets: + - name: gitea-registry + containers: + - name: server + image: git.automatizase.com.br/luis.erlacher/archon/server:v1.0.42 + ports: + - containerPort: 8181 +``` + +## Versionamento + +### Usando Tags Específicas (Recomendado para Produção) + +```yaml +services: + archon-server: + image: git.automatizase.com.br/luis.erlacher/archon/server:v1.0.42 +``` + +**Vantagens:** +- Builds reproduzíveis +- Rollback fácil +- Não quebra com atualizações + +### Usando Latest (Desenvolvimento) + +```yaml +services: + archon-server: + image: git.automatizase.com.br/luis.erlacher/archon/server:latest +``` + +**Vantagens:** +- Sempre atualizado +- Ideal para staging/dev + +## CI/CD Pipeline + +O workflow `.gitea/workflows/build-push-images.yml` é disparado: + +1. **Em push para main** - Cria versão `v1.0.X` e `latest` +2. **Em tags git** - Usa a tag como versão (ex: `v2.0.0`) +3. **Manual** - Via workflow_dispatch no Gitea Actions + +### Criar Release com Tag + +```bash +git tag -a v2.0.0 -m "Release version 2.0.0" +git push origin v2.0.0 +``` + +Isso irá buildar e publicar todas as imagens com tag `v2.0.0`. + +## Variáveis de Ambiente Necessárias + +No Gitea Actions, configure os secrets: + +- `GITEA_USERNAME` - Usuário do Gitea (luis.erlacher) +- `GITEA_TOKEN` - Token de acesso com permissões de package + +### Configurar Secrets no Gitea + +1. Acesse: https://git.automatizase.com.br/luis.erlacher/Archon/settings/secrets +2. Adicione: + - Name: `GITEA_USERNAME`, Value: `luis.erlacher` + - Name: `GITEA_TOKEN`, Value: `[seu token]` + +## Troubleshooting + +### Erro de Autenticação + +```bash +# Verificar login +docker logout git.automatizase.com.br +docker login git.automatizase.com.br + +# Pull de teste +docker pull git.automatizase.com.br/luis.erlacher/archon/server:latest +``` + +### Ver Versões Disponíveis + +Acesse: https://git.automatizase.com.br/luis.erlacher/-/packages + +### Limpar Imagens Antigas Localmente + +```bash +docker images | grep "git.automatizase.com.br" | awk '{print $3}' | xargs docker rmi +``` + +## Para DevOps/SRE + +### Helm Chart (exemplo básico) + +```yaml +# values.yaml +image: + registry: git.automatizase.com.br + repository: luis.erlacher/archon + tag: v1.0.42 + pullSecrets: + - gitea-registry + +server: + image: "{{ .Values.image.registry }}/{{ .Values.image.repository }}/server:{{ .Values.image.tag }}" + +mcp: + image: "{{ .Values.image.registry }}/{{ .Values.image.repository }}/mcp:{{ .Values.image.tag }}" +``` + +### ArgoCD Application + +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: archon +spec: + source: + repoURL: https://git.automatizase.com.br/luis.erlacher/Archon.git + targetRevision: main + path: k8s/manifests + destination: + server: https://kubernetes.default.svc + namespace: archon +``` + +## Suporte + +Para issues ou dúvidas: +- Issues: https://git.automatizase.com.br/luis.erlacher/Archon/issues +- CI/CD Logs: https://git.automatizase.com.br/luis.erlacher/Archon/actions diff --git a/docker-compose.registry.yml b/docker-compose.registry.yml new file mode 100644 index 0000000..6ab44d0 --- /dev/null +++ b/docker-compose.registry.yml @@ -0,0 +1,97 @@ +# Docker Compose usando imagens do Registry Gitea +# Para usar este arquivo: docker compose -f docker-compose.registry.yml up -d + +services: + # Server Service (FastAPI + Socket.IO + Crawling) + archon-server: + image: git.automatizase.com.br/luis.erlacher/archon/server:latest + container_name: archon-server + ports: + - "${ARCHON_SERVER_PORT:-8181}:${ARCHON_SERVER_PORT:-8181}" + environment: + - SUPABASE_URL=${SUPABASE_URL} + - SUPABASE_SERVICE_KEY=${SUPABASE_SERVICE_KEY} + - OPENAI_API_KEY=${OPENAI_API_KEY:-} + - LOGFIRE_TOKEN=${LOGFIRE_TOKEN:-} + - SERVICE_DISCOVERY_MODE=docker_compose + - LOG_LEVEL=${LOG_LEVEL:-INFO} + - ARCHON_SERVER_PORT=${ARCHON_SERVER_PORT:-8181} + - ARCHON_MCP_PORT=${ARCHON_MCP_PORT:-8051} + - ARCHON_AGENTS_PORT=${ARCHON_AGENTS_PORT:-8052} + - AGENTS_ENABLED=${AGENTS_ENABLED:-false} + - ARCHON_HOST=${HOST:-localhost} + networks: + - app-network + volumes: + - /var/run/docker.sock:/var/run/docker.sock + extra_hosts: + - "host.docker.internal:host-gateway" + + # Lightweight MCP Server Service (HTTP-based) + archon-mcp: + image: git.automatizase.com.br/luis.erlacher/archon/mcp:latest + container_name: archon-mcp + ports: + - "${ARCHON_MCP_PORT:-8051}:${ARCHON_MCP_PORT:-8051}" + environment: + - SUPABASE_URL=${SUPABASE_URL} + - SUPABASE_SERVICE_KEY=${SUPABASE_SERVICE_KEY} + - LOGFIRE_TOKEN=${LOGFIRE_TOKEN:-} + - SERVICE_DISCOVERY_MODE=docker_compose + - TRANSPORT=sse + - LOG_LEVEL=${LOG_LEVEL:-INFO} + - API_SERVICE_URL=http://archon-server:${ARCHON_SERVER_PORT:-8181} + - AGENTS_ENABLED=${AGENTS_ENABLED:-false} + - AGENTS_SERVICE_URL=${AGENTS_SERVICE_URL:-http://archon-agents:${ARCHON_AGENTS_PORT:-8052}} + - ARCHON_MCP_PORT=${ARCHON_MCP_PORT:-8051} + - ARCHON_SERVER_PORT=${ARCHON_SERVER_PORT:-8181} + - ARCHON_AGENTS_PORT=${ARCHON_AGENTS_PORT:-8052} + networks: + - app-network + depends_on: + - archon-server + extra_hosts: + - "host.docker.internal:host-gateway" + + # AI Agents Service (ML/Reranking) - Opcional + archon-agents: + image: git.automatizase.com.br/luis.erlacher/archon/agents:latest + profiles: + - agents + container_name: archon-agents + ports: + - "${ARCHON_AGENTS_PORT:-8052}:${ARCHON_AGENTS_PORT:-8052}" + environment: + - SUPABASE_URL=${SUPABASE_URL} + - SUPABASE_SERVICE_KEY=${SUPABASE_SERVICE_KEY} + - OPENAI_API_KEY=${OPENAI_API_KEY:-} + - LOGFIRE_TOKEN=${LOGFIRE_TOKEN:-} + - SERVICE_DISCOVERY_MODE=docker_compose + - LOG_LEVEL=${LOG_LEVEL:-INFO} + - ARCHON_AGENTS_PORT=${ARCHON_AGENTS_PORT:-8052} + - ARCHON_SERVER_PORT=${ARCHON_SERVER_PORT:-8181} + networks: + - app-network + + # Frontend + archon-frontend: + image: git.automatizase.com.br/luis.erlacher/archon/frontend:latest + container_name: archon-ui + ports: + - "${ARCHON_UI_PORT:-3737}:3737" + environment: + - VITE_ARCHON_SERVER_PORT=${ARCHON_SERVER_PORT:-8181} + - ARCHON_SERVER_PORT=${ARCHON_SERVER_PORT:-8181} + - HOST=${HOST:-localhost} + - PROD=${PROD:-false} + - VITE_ALLOWED_HOSTS=${VITE_ALLOWED_HOSTS:-} + - VITE_SHOW_DEVTOOLS=${VITE_SHOW_DEVTOOLS:-false} + - DOCKER_ENV=true + networks: + - app-network + depends_on: + - archon-server + +networks: + app-network: + driver: bridge