Compare commits

2 Commits

Author SHA1 Message Date
f2b629eaad chore: organize project and update service
All checks were successful
Deploy NestJS API / build-and-push-deploy (push) Successful in 2m13s
2026-01-29 11:49:01 -03:00
3b8b079123 docs: add kubernetes and workflow documentation
Some checks failed
Deploy NestJS API / build-and-push-deploy (push) Failing after 8s
2026-01-29 11:28:35 -03:00
14 changed files with 288 additions and 13 deletions

View File

@@ -21,7 +21,3 @@ 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 }}"

View File

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

76
KUBERNETES.md Normal file
View File

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

57
WORKFLOWS.md Normal file
View File

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

View File

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

10
k8s/base/configmap.yaml Normal file
View File

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

62
k8s/base/deployment.yaml Normal file
View File

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

View File

@@ -0,0 +1,7 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
- configmap.yaml

8
k8s/base/secret.yaml Normal file
View File

@@ -0,0 +1,8 @@
apiVersion: v1
kind: Secret
metadata:
name: vendaweb-api-secrets
type: Opaque
stringData:
DB_USERNAME: 'simplifique'
DB_PASSWORD: 'simplifique'

15
k8s/base/service.yaml Normal file
View File

@@ -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: 8067
targetPort: 8067
protocol: TCP

View File

@@ -0,0 +1,10 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: vendaweb-api
spec:
template:
spec:
containers:
- name: api
image: 172.35.0.216/library/vendaweb-api@sha256:aac490fcb4ef7baa95f1df01fa50d2d44bdb4ed12b235e5dd89e1d7dc3cd0a3a

View File

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

View File

@@ -0,0 +1,11 @@
apiVersion: v1
kind: Service
metadata:
name: vendaweb-api
spec:
type: NodePort
ports:
- name: http
port: 8067
targetPort: 8067
nodePort: 30001

View File

@@ -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();