From bb7af7a99a35de167b83a751f543259c35bd6762 Mon Sep 17 00:00:00 2001 From: Sidney Date: Sun, 7 Jun 2026 17:46:24 -0300 Subject: [PATCH] ci: configurar Gitea Actions e Watchtower em paridade com EduManager --- .gitea/workflows/deploy.yml | 51 ++++++++++++++ docker-compose.yml | 137 ++++++++++-------------------------- 2 files changed, 89 insertions(+), 99 deletions(-) create mode 100644 .gitea/workflows/deploy.yml diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..ddffbf8 --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,51 @@ +name: Build and Deploy (Gitea Actions) + +on: + push: + branches: [ main ] + workflow_dispatch: {} + +jobs: + build-and-push: + runs-on: self-hosted + + 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 + uses: docker/login-action@v3 + with: + registry: gitea.microtecinformaticacurso.com.br + username: ${{ github.actor }} + password: ${{ secrets.GITEA_TOKEN }} + + - name: Build and push App + uses: docker/build-push-action@v5 + with: + context: . + push: true + platforms: linux/arm64 + tags: gitea.microtecinformaticacurso.com.br/${{ github.repository }}/agendapro-app:latest + + - name: Build and push Admin + uses: docker/build-push-action@v5 + with: + context: ./admin + push: true + platforms: linux/arm64 + tags: gitea.microtecinformaticacurso.com.br/${{ github.repository }}/agendapro-admin:latest + + - name: Atualizar Containers em Produção (Watchtower) + run: | + AUTH=$(echo -n "${{ github.actor }}:${{ secrets.GITEA_TOKEN }}" | base64 -w 0) + echo "{\"auths\": {\"gitea.microtecinformaticacurso.com.br\": {\"auth\": \"$AUTH\"}}}" > $(pwd)/registry-config.json + + docker run --rm \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v $(pwd)/registry-config.json:/config.json \ + containrrr/watchtower \ + --run-once --cleanup --debug diff --git a/docker-compose.yml b/docker-compose.yml index 3442736..79003ac 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,47 +2,11 @@ version: "3.8" services: # ============================================================= - # TRAEFIK — Reverse Proxy & SSL (Let's Encrypt) + # POSTGRESQL — Banco de Dados do AgendaPRO (Isolado) # ============================================================= - traefik: - image: traefik:v2.11 - command: - - "--api.dashboard=true" - - "--providers.docker=true" - - "--providers.docker.swarmMode=true" - - "--providers.docker.exposedbydefault=false" - - "--entrypoints.web.address=:80" - - "--entrypoints.websecure.address=:443" - - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" - - "--certificatesresolvers.letsencrypt.acme.email=admin@agendapro.com.br" - - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" - - "--entrypoints.web.http.redirections.entrypoint.to=websecure" - - "--entrypoints.web.http.redirections.entrypoint.scheme=https" - ports: - - "80:80" - - "443:443" - volumes: - - "/var/run/docker.sock:/var/run/docker.sock:ro" - - "traefik-certs:/letsencrypt" - networks: - - webproxy - deploy: - replicas: 1 - placement: - constraints: [node.role == manager] - labels: - - "traefik.enable=true" - - "traefik.http.routers.traefik.rule=Host(`traefik.agendapro.com.br`)" - - "traefik.http.routers.traefik.entrypoints=websecure" - - "traefik.http.routers.traefik.tls.certresolver=letsencrypt" - - "traefik.http.routers.traefik.service=api@internal" - - "traefik.http.services.traefik.loadbalancer.server.port=8080" - - # ============================================================= - # POSTGRESQL — Banco de Dados Compartilhado - # ============================================================= - postgres: + postgres-agendapro: image: postgres:16-alpine + restart: always environment: POSTGRES_DB: agendapro POSTGRES_USER: agendapro_user @@ -50,63 +14,51 @@ services: secrets: - db_password volumes: - - pgdata:/var/lib/postgresql/data - - ./database/init.sql:/docker-entrypoint-initdb.d/01-init.sql + - pgdata-agendapro:/var/lib/postgresql/data networks: - - backend - deploy: - replicas: 1 - placement: - constraints: [node.role == manager] + - agendapro-internal + healthcheck: + test: ["CMD-SHELL", "pg_isready -U agendapro_user"] + interval: 10s + timeout: 5s + retries: 5 # ============================================================= - # AGENDAPRO APP — Sistema Principal (app.agendapro.com.br) + # AGENDAPRO APP — Sistema Principal # ============================================================= agendapro: - image: agendapro-app:latest - build: - context: . - dockerfile: Dockerfile + image: gitea.microtecinformaticacurso.com.br/sidney/agendapro/agendapro-app:latest + restart: always + depends_on: + - postgres-agendapro environment: - DATABASE_URL: postgresql://agendapro_user:${DB_PASSWORD}@postgres:5432/agendapro + DATABASE_URL: postgresql://agendapro_user:${DB_PASSWORD}@postgres-agendapro:5432/agendapro JWT_SECRET_FILE: /run/secrets/jwt_secret NODE_ENV: production secrets: - jwt_secret networks: - - webproxy - - backend + - agendapro-internal + - network_public deploy: - replicas: 2 - update_config: - parallelism: 1 - delay: 10s - order: start-first - rollback_config: - parallelism: 1 - restart_policy: - condition: on-failure - delay: 5s - max_attempts: 3 labels: - "traefik.enable=true" - "traefik.http.routers.agendapro.rule=Host(`app.agendapro.com.br`)" - "traefik.http.routers.agendapro.entrypoints=websecure" - - "traefik.http.routers.agendapro.tls.certresolver=letsencrypt" + - "traefik.http.routers.agendapro.tls.certresolver=leresolver" - "traefik.http.services.agendapro.loadbalancer.server.port=3000" - - "traefik.http.services.agendapro.loadbalancer.healthcheck.path=/api/health" - - "traefik.http.services.agendapro.loadbalancer.healthcheck.interval=15s" + - "traefik.docker.network=network_public" # ============================================================= - # ADMIN PANEL — Gerenciador de Assinaturas (admin.agendapro.com.br) + # ADMIN PANEL — Gerenciador de Assinaturas # ============================================================= - admin: - image: agendapro-admin:latest - build: - context: ./admin - dockerfile: Dockerfile + admin-agendapro: + image: gitea.microtecinformaticacurso.com.br/sidney/agendapro/agendapro-admin:latest + restart: always + depends_on: + - postgres-agendapro environment: - DATABASE_URL: postgresql://agendapro_user:${DB_PASSWORD}@postgres:5432/agendapro + DATABASE_URL: postgresql://agendapro_user:${DB_PASSWORD}@postgres-agendapro:5432/agendapro JWT_SECRET_FILE: /run/secrets/jwt_secret ADMIN_SECRET_FILE: /run/secrets/admin_secret NODE_ENV: production @@ -114,38 +66,25 @@ services: - jwt_secret - admin_secret networks: - - webproxy - - backend + - agendapro-internal + - network_public deploy: - replicas: 1 - update_config: - parallelism: 1 - delay: 10s - restart_policy: - condition: on-failure - delay: 5s - max_attempts: 3 labels: - "traefik.enable=true" - - "traefik.http.routers.admin.rule=Host(`admin.agendapro.com.br`)" - - "traefik.http.routers.admin.entrypoints=websecure" - - "traefik.http.routers.admin.tls.certresolver=letsencrypt" - - "traefik.http.services.admin.loadbalancer.server.port=3001" - # Proteção extra: Basic Auth no admin - - "traefik.http.routers.admin.middlewares=admin-auth" - - "traefik.http.middlewares.admin-auth.basicauth.users=admin:$$apr1$$xyz$$hashedpassword" + - "traefik.http.routers.admin-agendapro.rule=Host(`admin.agendapro.com.br`)" + - "traefik.http.routers.admin-agendapro.entrypoints=websecure" + - "traefik.http.routers.admin-agendapro.tls.certresolver=leresolver" + - "traefik.http.services.admin-agendapro.loadbalancer.server.port=3001" + - "traefik.docker.network=network_public" volumes: - pgdata: - traefik-certs: + pgdata-agendapro: networks: - webproxy: + agendapro-internal: driver: overlay - external: false - backend: - driver: overlay - internal: true + network_public: + external: true secrets: db_password: