ci: configurar Gitea Actions e Watchtower em paridade com EduManager

This commit is contained in:
Sidney 2026-06-07 17:46:24 -03:00
parent 3cc5498d51
commit bb7af7a99a
2 changed files with 89 additions and 99 deletions

View File

@ -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

View File

@ -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: