From 18c0601b11d362b7fe797e02f82890588d05d66e Mon Sep 17 00:00:00 2001 From: NANDO9322 Date: Wed, 21 Jan 2026 20:44:27 -0300 Subject: [PATCH] jesus --- backend/.forgejo/workflows/deploy.yaml | 27 +++++++++++++++++++ backend/k8s/deployment.yaml | 37 ++++++++++++++++++++++++++ backend/k8s/ingress.yaml | 29 ++++++++++++++++++++ backend/k8s/service.yaml | 12 +++++++++ frontend/.env.example | 2 +- frontend/contexts/AuthContext.tsx | 9 ++++--- 6 files changed, 112 insertions(+), 4 deletions(-) create mode 100644 backend/.forgejo/workflows/deploy.yaml create mode 100644 backend/k8s/deployment.yaml create mode 100644 backend/k8s/ingress.yaml create mode 100644 backend/k8s/service.yaml diff --git a/backend/.forgejo/workflows/deploy.yaml b/backend/.forgejo/workflows/deploy.yaml new file mode 100644 index 0000000..de31f13 --- /dev/null +++ b/backend/.forgejo/workflows/deploy.yaml @@ -0,0 +1,27 @@ +name: K3s Auto-Deploy +on: [push] + +jobs: + build-and-deploy: + runs-on: self-hosted + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Build and Push Image + run: | + # Logando com o token que você já gerou + echo "${{ secrets.FORGEJO_TOKEN }}" | docker login git.saveinmed.com.br -u ${{ github.actor }} --password-stdin + + # Build e Push automáticos + docker build -t git.saveinmed.com.br/${{ github.repository }}:latest . + docker push git.saveinmed.com.br/${{ github.repository }}:latest + + - name: Deploy to K3s + run: | + # Aplica os arquivos da pasta k8s + kubectl apply -f k8s/deployment.yaml + kubectl apply -f k8s/service.yaml + + # AJUSTE AQUI: Use o nome que está no seu metadata.name do deployment.yaml + kubectl rollout restart deployment/photum-backend -n photum diff --git a/backend/k8s/deployment.yaml b/backend/k8s/deployment.yaml new file mode 100644 index 0000000..5fce685 --- /dev/null +++ b/backend/k8s/deployment.yaml @@ -0,0 +1,37 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: photum-backend + namespace: photum +spec: + replicas: 1 + selector: + matchLabels: + app: photum + template: + metadata: + labels: + app: photum + spec: + imagePullSecrets: + - name: forgejo-registry-secret + containers: + - name: photum-app + image: git.saveinmed.com.br/yamamoto/photum:latest + ports: + - containerPort: 8080 + env: + - name: APP_ENV + value: "dev" + - name: APP_PORT + value: "8080" + - name: DB_DSN + value: "postgres://lol:k4m4d483@postgresql-207025-0.cloudclusters.net:10110/photum?sslmode=disable" + - name: JWT_ACCESS_SECRET + value: "supersecretkey" + - name: JWT_REFRESH_SECRET + value: "superrefreshsecret" + - name: JWT_ACCESS_TTL_MINUTES + value: "15" + - name: JWT_REFRESH_TTL_DAYS + value: "30" diff --git a/backend/k8s/ingress.yaml b/backend/k8s/ingress.yaml new file mode 100644 index 0000000..b546554 --- /dev/null +++ b/backend/k8s/ingress.yaml @@ -0,0 +1,29 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: photum-ingress + namespace: photum + annotations: + # Emite o certificado SSL automaticamente + cert-manager.io/cluster-issuer: letsencrypt-prod + # Define o Traefik como controlador + kubernetes.io/ingress.class: traefik + # Comando para o External-DNS criar o registro no Cloudflare + external-dns.alpha.kubernetes.io/hostname: api-dev.photum.app.br +spec: + tls: + - hosts: + - api-dev.photum.app.br + # O certificado será armazenado neste secret + secretName: photum-tls-cert + rules: + - host: api-dev.photum.app.br + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: photum-service + port: + number: 80 diff --git a/backend/k8s/service.yaml b/backend/k8s/service.yaml new file mode 100644 index 0000000..62efa68 --- /dev/null +++ b/backend/k8s/service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: photum-service + namespace: photum +spec: + selector: + app: photum + ports: + - protocol: TCP + port: 80 + targetPort: 8080 # A porta que você definiu na variável APP_PORT diff --git a/frontend/.env.example b/frontend/.env.example index 6502e07..fd01320 100644 --- a/frontend/.env.example +++ b/frontend/.env.example @@ -12,7 +12,7 @@ VITE_MAPBOX_TOKEN=YOUR_MAPBOX_TOKEN_HERE # Configure a URL base do seu backend API # Default: http://localhost:3000/api -VITE_API_URL=http://localhost:3000/api +VITE_API_URL=http://localhost:8080/api # Nota: A chave do Mapbox já está configurada diretamente no código para demonstração # Em produção, use variáveis de ambiente como acima diff --git a/frontend/contexts/AuthContext.tsx b/frontend/contexts/AuthContext.tsx index 2d95d52..588c223 100644 --- a/frontend/contexts/AuthContext.tsx +++ b/frontend/contexts/AuthContext.tsx @@ -61,7 +61,8 @@ export const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => if (!token) return; try { - const response = await fetch(`${import.meta.env.VITE_API_URL}/api/me`, { + const API_URL = import.meta.env.VITE_API_URL || "http://localhost:8080"; + const response = await fetch(`${API_URL}/api/me`, { headers: { 'Authorization': `Bearer ${token}` } @@ -123,10 +124,12 @@ export const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => return "Ocorreu um erro inesperado. Tente novamente."; }; - const login = async (email: string, password?: string) => { +const API_URL = import.meta.env.VITE_API_URL || "http://localhost:8080"; + +const login = async (email: string, password?: string) => { // 1. Try Real API first try { - const response = await fetch(`${import.meta.env.VITE_API_URL}/auth/login`, { + const response = await fetch(`${API_URL}/auth/login`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email, senha: password })