ci: configurar Gitea Actions e Watchtower em paridade com EduManager
This commit is contained in:
parent
3cc5498d51
commit
bb7af7a99a
|
|
@ -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
|
||||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue