From 3b8b0791238e1e7644c91d8c329f99ee3d215e33 Mon Sep 17 00:00:00 2001 From: Joelbrit0 Date: Thu, 29 Jan 2026 11:28:35 -0300 Subject: [PATCH 1/2] docs: add kubernetes and workflow documentation --- .gitea/workflows/deploy-api.yaml | 6 +- .gitea/workflows/rollback.md | 7 -- KUBERNETES.md | 76 +++++++++++++++++++ WORKFLOWS.md | 57 ++++++++++++++ k8s/argocd/application-prod.yaml | 19 +++++ k8s/base/configmap.yaml | 10 +++ k8s/base/deployment.yaml | 62 +++++++++++++++ k8s/base/kustomization.yaml | 7 ++ k8s/base/secret.yaml | 8 ++ k8s/base/service.yaml | 15 ++++ .../prod/deployment-image-digest-patch.yaml | 10 +++ k8s/overlays/prod/kustomization.yaml | 11 +++ k8s/overlays/prod/service-patch.yaml | 11 +++ 13 files changed, 287 insertions(+), 12 deletions(-) delete mode 100644 .gitea/workflows/rollback.md create mode 100644 KUBERNETES.md create mode 100644 WORKFLOWS.md create mode 100644 k8s/argocd/application-prod.yaml create mode 100644 k8s/base/configmap.yaml create mode 100644 k8s/base/deployment.yaml create mode 100644 k8s/base/kustomization.yaml create mode 100644 k8s/base/secret.yaml create mode 100644 k8s/base/service.yaml create mode 100644 k8s/overlays/prod/deployment-image-digest-patch.yaml create mode 100644 k8s/overlays/prod/kustomization.yaml create mode 100644 k8s/overlays/prod/service-patch.yaml diff --git a/.gitea/workflows/deploy-api.yaml b/.gitea/workflows/deploy-api.yaml index 04c29a7..f6cec31 100644 --- a/.gitea/workflows/deploy-api.yaml +++ b/.gitea/workflows/deploy-api.yaml @@ -20,8 +20,4 @@ jobs: docker push 172.35.0.216/library/vendaweb-api:$TAG docker push 172.35.0.216/library/vendaweb-api:latest - - - name: Notificar Portainer via Webhook - run: | - # O Webhook avisa o Portainer para puxar a nova imagem imediatamente - curl -X POST "${{ secrets.PORTAINER_WEBHOOK_VENDAWEBAPI }}" \ No newline at end of file + \ No newline at end of file diff --git a/.gitea/workflows/rollback.md b/.gitea/workflows/rollback.md deleted file mode 100644 index 74f0df8..0000000 --- a/.gitea/workflows/rollback.md +++ /dev/null @@ -1,7 +0,0 @@ -O Rollback via Git (Mais Seguro) - -No Gitea, faça um git revert no commit que deu erro. - -Dê o git push. - -O Portainer detectará a mudança e atualizará o serviço para a versão estável de forma oficial. \ No newline at end of file diff --git a/KUBERNETES.md b/KUBERNETES.md new file mode 100644 index 0000000..a948493 --- /dev/null +++ b/KUBERNETES.md @@ -0,0 +1,76 @@ +# Documentação do Kubernetes + +Este documento descreve a infraestrutura e configuração do Kubernetes para o projeto **Vendaweb-api**, utilizando uma abordagem GitOps com ArgoCD e Kustomize. + +## Estrutura de Diretórios e Arquivos + +A configuração do Kubernetes está localizada no diretório `k8s/` e segue uma estrutura organizada para facilitar a manutenção e escalabilidade: + +``` +k8s/ +├── argocd/ # Configurações do ArgoCD +│ └── application-prod.yaml # Definição da Application para o ambiente de produção +├── base/ # Recursos base do Kubernetes (Kustomize Base) +│ ├── configmap.yaml # ConfigMap base +│ ├── deployment.yaml # Deployment base da aplicação +│ ├── kustomization.yaml # Arquivo principal do Kustomize Base +│ ├── secret.yaml # Secret base +│ └── service.yaml # Service base +└── overlays/ # Sobrescritas para diferentes ambientes (Kustomize Overlays) + └── prod/ # Ambiente de produção + ├── application-prod.yaml + ├── deployment-image-digest-patch.yaml + ├── kustomization.yaml + └── service-patch.yaml +``` + +## Recursos Base (`k8s/base`) + +O diretório `base` contém as definições padrão dos recursos que são comuns a todos os ambientes. + +### Deployment (`deployment.yaml`) + +- **Nome**: `vendaweb-api` +- **Replicas**: 15 (Configuração base) +- **Imagem**: `172.35.0.216/library/vendaweb-api:latest` +- **Porta do Container**: 8065 +- **Resources**: + - Requests: CPU 100m, Memory 256Mi + - Limits: CPU 500m, Memory 512Mi +- **Probes**: Liveness, Readiness e Startup probes configurados no endpoint `/v1/health`. +- **Environment**: Configurações carregadas via ConfigMap e Secret. + +### Service (`service.yaml`) + +- **Tipo**: ClusterIP +- **Porta**: 8065 (TCP) + +## Ambientes (`k8s/overlays`) + +### Produção (`k8s/overlays/prod`) + +A sobreposição de produção personaliza a configuração base para o ambiente produtivo. + +- **Namespace**: `vendaweb-prod` +- **Patches**: Aplica modificações específicas (ex: digest da imagem, configurações específicas de serviço) via `kustomization.yaml`. + +## Deploy com ArgoCD (`k8s/argocd`) + +O deploy é gerenciado pelo ArgoCD, que sincroniza o estado do cluster com o repositório Git. + +### Application (`application-prod.yaml`) + +- **Nome**: `vendaweb-api-prod` +- **Namespace do ArgoCD**: `argocd` +- **Origem (Source)**: + - Repositório: `https://git.simplifiquehc.com.br/simplifique/Vendaweb-api.git` + - Revisão: `main` + - Path: `k8s/overlays/prod` (Aponta para o overlay de produção) +- **Destino (Destination)**: + - Cluster: `https://kubernetes.default.svc` + - Namespace: `vendaweb-api` (Nota: O patch define `vendaweb-prod`, verifique a consistência) +- **Sync Policy**: Automatizado com `selfHeal` ativado e criação automática de namespace. + +--- + +**Observação**: Certifique-se de que as credenciais do Harbor (`imagePullSecrets`) estejam corretamente configuradas no namespace de destino para permitir o pull da imagem. diff --git a/WORKFLOWS.md b/WORKFLOWS.md new file mode 100644 index 0000000..5c4315a --- /dev/null +++ b/WORKFLOWS.md @@ -0,0 +1,57 @@ +# Documentação dos Workflows (Gitea Actions) + +Este documento descreve os fluxos de trabalho de integração contínua (CI) e entrega contínua (CD) configurados no Gitea Actions para o projeto **Vendaweb-api**. + +## Visão Geral + +Os workflows estão definidos no diretório `.gitea/workflows/`. O principal workflow configurado é o deploy da API. + +## Workflow: Deploy NestJS API + +**Arquivo**: `.gitea/workflows/deploy-api.yaml` + +### Gatilhos (Triggers) + +Este workflow é acionado automaticamente no evento: + +- `push`: Em qualquer branch (configuração atual `on: [push]`). + +### Jobs + +#### `build-and-push-deploy` + +Este job é responsável por construir a imagem Docker e enviá-la para o registry privado (Harbor). + +- **Ambiente de Execução**: `ubuntu-latest` (Runner) + +#### Passos (Steps): + +1. **Checkout** + - Utiliza `actions/checkout@v3` para clonar o código fonte do repositório. + +2. **Login no Harbor** + - Realiza autenticação no registry Docker privado. + - **Registry**: `172.35.0.216` + - **Segredos Utilizados**: + - `HARBOR_USERNAME`: Nome de usuário do Harbor. + - `HARBOR_PASSWORD`: Senha do usuário do Harbor. + +3. **Build e Push** + - Constrói a imagem Docker da aplicação. + - Tags geradas: + - `172.35.0.216/library/vendaweb-api:$TAG` (onde `$TAG` é o SHA do commit do Gitea `gitea.sha`) + - `172.35.0.216/library/vendaweb-api:latest` + - Envia ambas as tags para o registry. + +## Variáveis e Segredos (Secrets) + +Para que o workflow funcione corretamente, as seguintes secrets devem estar configuradas nas configurações do repositório no Gitea: + +| Secret | Descrição | +| ----------------- | ------------------------------------------------------------- | +| `HARBOR_USERNAME` | Usuário com permissão de push no projeto `library` do Harbor. | +| `HARBOR_PASSWORD` | Senha ou token de acesso do usuário do Harbor. | + +## Integração com Kubernetes + +Após o push da imagem com a tag `latest` (e o SHA específico), o ArgoCD (configurado conforme `KUBERNETES.md`) detectará as mudanças se houver alteração nos manifestos ou se estiver configurado para pollar a imagem `latest` (dependendo da política de `imagePullPolicy` e configuração do ArgoCD Image Updater, se houver). diff --git a/k8s/argocd/application-prod.yaml b/k8s/argocd/application-prod.yaml new file mode 100644 index 0000000..f94fb0f --- /dev/null +++ b/k8s/argocd/application-prod.yaml @@ -0,0 +1,19 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: vendaweb-api-prod + namespace: argocd +spec: + project: default + source: + repoURL: https://git.simplifiquehc.com.br/simplifique/Vendaweb-api.git + targetRevision: main + path: k8s/overlays/prod + destination: + server: https://kubernetes.default.svc + namespace: vendaweb-api + syncPolicy: + automated: + selfHeal: true + syncOptions: + - CreateNamespace=true diff --git a/k8s/base/configmap.yaml b/k8s/base/configmap.yaml new file mode 100644 index 0000000..d3bcd05 --- /dev/null +++ b/k8s/base/configmap.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: vendaweb-api-config +data: + REDIS_HOST: '172.35.0.250' + REDIS_PORT: '6379' + DB_HOST: '172.35.0.250' + DB_PORT: '1521' + DB_SERVICE_NAME: 'ORCL' diff --git a/k8s/base/deployment.yaml b/k8s/base/deployment.yaml new file mode 100644 index 0000000..8a3bef4 --- /dev/null +++ b/k8s/base/deployment.yaml @@ -0,0 +1,62 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vendaweb-api + labels: + app: vendaweb-api +spec: + replicas: 15 + selector: + matchLabels: + app: vendaweb-api + template: + metadata: + labels: + app: vendaweb-api + spec: + imagePullSecrets: + - name: harbor-secret + containers: + - name: api + image: 172.35.0.216/library/vendaweb-api:latest + imagePullPolicy: IfNotPresent + ports: + - name: http + containerPort: 8065 + protocol: TCP + envFrom: + - configMapRef: + name: vendaweb-api-config + - secretRef: + name: vendaweb-api-secrets + livenessProbe: + httpGet: + path: /v1/health + port: http + initialDelaySeconds: 20 + periodSeconds: 10 + timeoutSeconds: 2 + failureThreshold: 6 + readinessProbe: + httpGet: + path: /v1/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 2 + failureThreshold: 6 + startupProbe: + httpGet: + path: /v1/health + port: http + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 2 + failureThreshold: 24 + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: 500m + memory: 512Mi diff --git a/k8s/base/kustomization.yaml b/k8s/base/kustomization.yaml new file mode 100644 index 0000000..ab071dc --- /dev/null +++ b/k8s/base/kustomization.yaml @@ -0,0 +1,7 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: + - deployment.yaml + - service.yaml + - configmap.yaml diff --git a/k8s/base/secret.yaml b/k8s/base/secret.yaml new file mode 100644 index 0000000..94cc475 --- /dev/null +++ b/k8s/base/secret.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +metadata: + name: vendaweb-api-secrets +type: Opaque +stringData: + DB_USERNAME: 'simplifique' + DB_PASSWORD: 'simplifique' diff --git a/k8s/base/service.yaml b/k8s/base/service.yaml new file mode 100644 index 0000000..3b21e5d --- /dev/null +++ b/k8s/base/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: vendaweb-api + labels: + app: vendaweb-api +spec: + type: ClusterIP + selector: + app: vendaweb-api + ports: + - name: http + port: 8065 + targetPort: 8065 + protocol: TCP diff --git a/k8s/overlays/prod/deployment-image-digest-patch.yaml b/k8s/overlays/prod/deployment-image-digest-patch.yaml new file mode 100644 index 0000000..3bf0c4a --- /dev/null +++ b/k8s/overlays/prod/deployment-image-digest-patch.yaml @@ -0,0 +1,10 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vendaweb-api +spec: + template: + spec: + containers: + - name: api + image: harbor.jurunense.com/library/vendaweb-api@sha256:aac490fcb4ef7baa95f1df01fa50d2d44bdb4ed12b235e5dd89e1d7dc3cd0a3a diff --git a/k8s/overlays/prod/kustomization.yaml b/k8s/overlays/prod/kustomization.yaml new file mode 100644 index 0000000..6b76f88 --- /dev/null +++ b/k8s/overlays/prod/kustomization.yaml @@ -0,0 +1,11 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +namespace: vendaweb-prod + +resources: + - ../../base + +patches: + - path: deployment-image-digest-patch.yaml + - path: service-patch.yaml diff --git a/k8s/overlays/prod/service-patch.yaml b/k8s/overlays/prod/service-patch.yaml new file mode 100644 index 0000000..e8afd3a --- /dev/null +++ b/k8s/overlays/prod/service-patch.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: vendaweb-api +spec: + type: NodePort + ports: + - name: http + port: 8065 + targetPort: 8065 + nodePort: 30001 From f2b629eaade0a4fd119ff47552bb1e95d0c13073 Mon Sep 17 00:00:00 2001 From: Joelbrit0 Date: Thu, 29 Jan 2026 11:49:01 -0300 Subject: [PATCH 2/2] chore: organize project and update service --- k8s/base/deployment.yaml | 2 +- k8s/base/service.yaml | 4 ++-- k8s/overlays/prod/deployment-image-digest-patch.yaml | 2 +- k8s/overlays/prod/service-patch.yaml | 4 ++-- src/main.ts | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/k8s/base/deployment.yaml b/k8s/base/deployment.yaml index 8a3bef4..eb670b0 100644 --- a/k8s/base/deployment.yaml +++ b/k8s/base/deployment.yaml @@ -22,7 +22,7 @@ spec: imagePullPolicy: IfNotPresent ports: - name: http - containerPort: 8065 + containerPort: 8067 protocol: TCP envFrom: - configMapRef: diff --git a/k8s/base/service.yaml b/k8s/base/service.yaml index 3b21e5d..50ea641 100644 --- a/k8s/base/service.yaml +++ b/k8s/base/service.yaml @@ -10,6 +10,6 @@ spec: app: vendaweb-api ports: - name: http - port: 8065 - targetPort: 8065 + port: 8067 + targetPort: 8067 protocol: TCP diff --git a/k8s/overlays/prod/deployment-image-digest-patch.yaml b/k8s/overlays/prod/deployment-image-digest-patch.yaml index 3bf0c4a..a8a5e4b 100644 --- a/k8s/overlays/prod/deployment-image-digest-patch.yaml +++ b/k8s/overlays/prod/deployment-image-digest-patch.yaml @@ -7,4 +7,4 @@ spec: spec: containers: - name: api - image: harbor.jurunense.com/library/vendaweb-api@sha256:aac490fcb4ef7baa95f1df01fa50d2d44bdb4ed12b235e5dd89e1d7dc3cd0a3a + image: 172.35.0.216/library/vendaweb-api@sha256:aac490fcb4ef7baa95f1df01fa50d2d44bdb4ed12b235e5dd89e1d7dc3cd0a3a diff --git a/k8s/overlays/prod/service-patch.yaml b/k8s/overlays/prod/service-patch.yaml index e8afd3a..cd72d7f 100644 --- a/k8s/overlays/prod/service-patch.yaml +++ b/k8s/overlays/prod/service-patch.yaml @@ -6,6 +6,6 @@ spec: type: NodePort ports: - name: http - port: 8065 - targetPort: 8065 + port: 8067 + targetPort: 8067 nodePort: 30001 diff --git a/src/main.ts b/src/main.ts index 169cb70..f6e85dc 100644 --- a/src/main.ts +++ b/src/main.ts @@ -20,6 +20,6 @@ async function bootstrap() { .build(); const document = SwaggerModule.createDocument(app, options); SwaggerModule.setup("docs", app, document); - await app.listen(8065); + await app.listen(8067); } bootstrap();