diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..89b3f2d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,73 @@ +# ============================================================================= +# GoHorse Jobs Frontend - Ultra-Optimized Dockerfile +# ============================================================================= +# syntax=docker/dockerfile:1 + +# ----------------------------------------------------------------------------- +# Stage 1: Base with pnpm +# ----------------------------------------------------------------------------- +FROM mirror.gcr.io/library/node:20-alpine AS base +RUN corepack enable && corepack prepare pnpm@latest --activate +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" + +# ----------------------------------------------------------------------------- +# Stage 2: Dependencies +# ----------------------------------------------------------------------------- +FROM base AS deps +WORKDIR /app +COPY package.json package-lock.json* pnpm-lock.yaml* ./ +RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ + pnpm import 2>/dev/null || true && \ + pnpm install --frozen-lockfile || pnpm install + +# ----------------------------------------------------------------------------- +# Stage 3: Builder (AQUI ESTAVA O PROBLEMA) +# ----------------------------------------------------------------------------- +FROM base AS builder +ENV NODE_OPTIONS="--max-old-space-size=512" +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules + +# CORREÇÃO: Copiando TODAS as configs e pastas necessárias +COPY package.json next.config.* tsconfig.json postcss.config.mjs ./ +# Se tiver outras configs como tailwind.config.ts, adicione aqui ou use COPY . . (com dockerignore bom) +COPY public ./public +COPY src ./src +# Adicionei a pasta messages que apareceu no seu ls +COPY messages ./messages + +# Build arguments +ARG NEXT_PUBLIC_API_URL=http://localhost:8521 +ARG NEXT_PUBLIC_BACKOFFICE_URL=http://localhost:3001 +ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL +ENV NEXT_PUBLIC_BACKOFFICE_URL=$NEXT_PUBLIC_BACKOFFICE_URL +ENV NEXT_TELEMETRY_DISABLED=1 + +RUN pnpm build && \ + rm -rf node_modules/.cache .next/cache + +# ----------------------------------------------------------------------------- +# Stage 4: Production Runner +# ----------------------------------------------------------------------------- +FROM mirror.gcr.io/library/node:20-alpine AS runner +WORKDIR /app + +RUN addgroup -g 1001 -S nodejs && \ + adduser -u 1001 -S nextjs -G nodejs + +ENV NODE_ENV=production \ + NEXT_TELEMETRY_DISABLED=1 \ + PORT=3000 \ + HOSTNAME="0.0.0.0" + +# O Docker faz o "cp" que você fez na mão AQUI: +COPY --from=builder --chown=nextjs:nodejs /app/public ./public +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +CMD ["node", "server.js"] \ No newline at end of file diff --git a/backend/scripts/validate_rsa_key.sh b/backend/scripts/validate_rsa_key.sh new file mode 100644 index 0000000..8f167c3 --- /dev/null +++ b/backend/scripts/validate_rsa_key.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -euo pipefail + +if [ -z "${RSA_PRIVATE_KEY_BASE64:-}" ]; then + echo "RSA_PRIVATE_KEY_BASE64 is not set" + exit 2 +fi + +# Try decode base64 +if echo "$RSA_PRIVATE_KEY_BASE64" | base64 -d > /tmp/rsa_key.pem 2>/dev/null; then + : +else + # Try replacing literal \n + echo "Attempting to replace literal \n and write PEM" + printf '%b' "$RSA_PRIVATE_KEY_BASE64" > /tmp/rsa_key.pem +fi + +# Validate with openssl +if openssl pkey -in /tmp/rsa_key.pem -noout -text >/dev/null 2>&1; then + echo "RSA private key is valid PEM" + exit 0 +else + echo "RSA private key is invalid" + echo "Preview (first 20 lines):" + sed -n '1,20p' /tmp/rsa_key.pem + exit 1 +fi diff --git a/frontend/src/app/api/config/route.ts b/frontend/src/app/api/config/route.ts index ce600e8..6691888 100644 --- a/frontend/src/app/api/config/route.ts +++ b/frontend/src/app/api/config/route.ts @@ -24,7 +24,7 @@ export async function GET() { const config = { apiUrl: process.env.API_URL || process.env.NEXT_PUBLIC_API_URL - || 'https://api-dev.gohorsejobs.com/', + || 'https://api.rede5.com.br/', backofficeUrl: process.env.BACKOFFICE_URL || process.env.NEXT_PUBLIC_BACKOFFICE_URL || 'http://localhost:3001', diff --git a/frontend/src/contexts/ConfigContext.tsx b/frontend/src/contexts/ConfigContext.tsx index eb7aed3..bd17724 100644 --- a/frontend/src/contexts/ConfigContext.tsx +++ b/frontend/src/contexts/ConfigContext.tsx @@ -10,7 +10,7 @@ export interface RuntimeConfig { } const defaultConfig: RuntimeConfig = { - apiUrl: process.env.NEXT_PUBLIC_API_URL || 'https://api-dev.gohorsejobs.com/', + apiUrl: process.env.NEXT_PUBLIC_API_URL || 'https://api.rede5.com.br/', backofficeUrl: process.env.NEXT_PUBLIC_BACKOFFICE_URL || 'http://localhost:3001', seederApiUrl: process.env.NEXT_PUBLIC_SEEDER_API_URL || 'http://localhost:3002', scraperApiUrl: process.env.NEXT_PUBLIC_SCRAPER_API_URL || 'http://localhost:3003', diff --git a/private_key.pem b/private_key.pem new file mode 100644 index 0000000..bb7dce1 --- /dev/null +++ b/private_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCc9suDobwJwCGJ +VFvga1BxKkmmGOxoF8zNibv6l33/SCFEBb5fFaenxvYotEGWUw0fed4zIcX3s6hA +q2yLr3nIygpLpcOfzpzPxas49P17NA3Chvo3k/0eGkBD6PHM1s62qPP+fKEZtwlS +q1WaFxfc949iqJAQvW6w/7WgMZDineq3IzhVVUAFdw3icZru97hCjPDU/v3eFTS7 +kvGrDYGAHZXzylu3Er9ifKYHdKxOrWFmGaSsPsYMdKNxWFk+Z38NVUnwSH3TEiV/ +S4e33tTkdMmNpY+6e9Cigb09RnOalj5lPjFGA9nTHMJxpsHvSKu8vMBr+OZ4CM3U +RH7MUX01AgMBAAECggEAMKxdFo/4MePY4m984B4W/0iYNv/iizLaKOBtoLsKcLeK +zT+ktXKPHzlUyvF+pyFQ3/JYA24VKAcXhRpDWhuLfcadI7Ee9PbKbKmEu3BJDEPr +gmd9vu9Ond+RDx30oUr5Je5FXySBhmpaYz7LGDHSDgzcc0EHD5HWed+JkEfegE7w +Mvt9KK41mGdaQwiPHS43uzZhQJEqybP3i/6SUnV2CntOhutxLlPk2rpHnns0p/St +Dvlcv61vduIaej4IFBrpSwTE45pvIfkvNZx0pJapM1jZhe8F/2T7GtXDkoFQveo1 +3YB1aadpCx7u28IzQTwBZVwqhCpi2a5+qVYUT0AU3wKBgQDYYUxQUBiUn6bXoAsx +JTozoX0K50cX2d8LVY1OUuhpRXbztS2XXtyfeoAQtEWoT3UO7vjEedWswfo2j+N3 +ZIXig7Vyj/LN5lZyCwWYn4S4inESjKlzi4Pv8D4F+Fkgg0WsVgzbTa4P7faHnDNn +eEHdyJ/ZQ8+XYxBpSAE8ecWQlwKBgQC5tGbfzh77REsv1h6b87vulrGHc+OBITTU +YFu1YfXpvbXx9geRfNLDtUhUis6vgfcQV6sxZVf78UdlqiTBebRLpcvoBlHV/MPZ +T3TsZH1vXwiitOsBIFzKkn8xdjuN6mN5lLjI6KkYeVoULYiUNbiZ+Wi7PXBPnc5I +jBO5EayOEwKBgQDU2pnso24avhatJKX92WYwphpQoISCBPPxvV38/3fbHtdOFBte +PZYAV8wlIoEnecpoP1J+TG+Su1r9U3xq1XsTAYd7w/kQ7RZ6pzcBFWLE+oMSwUZs +AIFwhb8ttklOv3PJfPi2vuqMhwUuD81NarI4jwQYASnz/SKGvqtgp1VezwKBgDoL +DOx+/GgE3ItDHaYY9HCKYUq5Ci7eNij7RS7YQ4ifZzMNdygeH7JUAxuJlzh8IsDU +5gk2Z92zeGFqYLqoU5YhaC5Ja2K68mwFzcHlVt9skMJqUdm0R8x5JZBMKCkfTaA+ +v9LsBY5Ev8b2xG2urNhTgEyl02jPJh6+yZtazthJAoGAHRIX/W0IlyaLno7WzAwM +lSsNfJpTvZmkri0UOGXM2YaKuQZ652t6EBDtfM7O16eV3KNBblt1LjItz/S8kiFi +Q8tGluO27Hn5/auixJjlcZnzoUXrEjAra8lmgAo41Dm0icDpLUzhixZ0qS8d6Yfp +RIT1IoWSuu2fvOOvqezq6bg= +-----END PRIVATE KEY----- diff --git a/rsa_base64.txt b/rsa_base64.txt new file mode 100644 index 0000000..5bb0e10 --- /dev/null +++ b/rsa_base64.txt @@ -0,0 +1 @@ +LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2UUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktjd2dnU2pBZ0VBQW9JQkFRQ2M5c3VEb2J3SndDR0oKVkZ2Z2ExQnhLa21tR094b0Y4ek5pYnY2bDMzL1NDRkVCYjVmRmFlbnh2WW90RUdXVXcwZmVkNHpJY1gzczZoQQpxMnlMcjNuSXlncExwY09menB6UHhhczQ5UDE3TkEzQ2h2bzNrLzBlR2tCRDZQSE0xczYycVBQK2ZLRVp0d2xTCnExV2FGeGZjOTQ5aXFKQVF2VzZ3LzdXZ01aRGluZXEzSXpoVlZVQUZkdzNpY1pydTk3aENqUERVL3YzZUZUUzcKa3ZHckRZR0FIWlh6eWx1M0VyOWlmS1lIZEt4T3JXRm1HYVNzUHNZTWRLTnhXRmsrWjM4TlZVbndTSDNURWlWLwpTNGUzM3RUa2RNbU5wWSs2ZTlDaWdiMDlSbk9hbGo1bFBqRkdBOW5USE1KeHBzSHZTS3U4dk1CcitPWjRDTTNVClJIN01VWDAxQWdNQkFBRUNnZ0VBTUt4ZEZvLzRNZVBZNG05ODRCNFcvMGlZTnYvaWl6TGFLT0J0b0xzS2NMZUsKelQra3RYS1BIemxVeXZGK3B5RlEzL0pZQTI0VktBY1hoUnBEV2h1TGZjYWRJN0VlOVBiS2JLbUV1M0JKREVQcgpnbWQ5dnU5T25kK1JEeDMwb1VyNUplNUZYeVNCaG1wYVl6N0xHREhTRGd6Y2MwRUhENUhXZWQrSmtFZmVnRTd3Ck12dDlLSzQxbUdkYVF3aVBIUzQzdXpaaFFKRXF5YlAzaS82U1VuVjJDbnRPaHV0eExsUGsycnBIbm5zMHAvU3QKRHZsY3Y2MXZkdUlhZWo0SUZCcnBTd1RFNDVwdklma3ZOWngwcEphcE0xalpoZThGLzJUN0d0WERrb0ZRdmVvMQozWUIxYWFkcEN4N3UyOEl6UVR3QlpWd3FoQ3BpMmE1K3FWWVVUMEFVM3dLQmdRRFlZVXhRVUJpVW42YlhvQXN4CkpUb3pvWDBLNTBjWDJkOExWWTFPVXVocFJYYnp0UzJYWHR5ZmVvQVF0RVdvVDNVTzd2akVlZFdzd2ZvMmorTjMKWklYaWc3VnlqL0xONWxaeUN3V1luNFM0aW5FU2pLbHppNFB2OEQ0RitGa2dnMFdzVmd6YlRhNFA3ZmFIbkRObgplRUhkeUovWlE4K1hZeEJwU0FFOGVjV1Fsd0tCZ1FDNXRHYmZ6aDc3UkVzdjFoNmI4N3Z1bHJHSGMrT0JJVFRVCllGdTFZZlhwdmJYeDlnZVJmTkxEdFVoVWlzNnZnZmNRVjZzeFpWZjc4VWRscWlUQmViUkxwY3ZvQmxIVi9NUFoKVDNUc1pIMXZYd2lpdE9zQklGektrbjh4ZGp1TjZtTjVsTGpJNktrWWVWb1VMWWlVTmJpWitXaTdQWEJQbmM1SQpqQk81RWF5T0V3S0JnUURVMnBuc28yNGF2aGF0SktYOTJXWXdwaHBRb0lTQ0JQUHh2VjM4LzNmYkh0ZE9GQnRlClBaWUFWOHdsSW9FbmVjcG9QMUorVEcrU3UxcjlVM3hxMVhzVEFZZDd3L2tRN1JaNnB6Y0JGV0xFK29NU3dVWnMKQUlGd2hiOHR0a2xPdjNQSmZQaTJ2dXFNaHdVdUQ4MU5hckk0andRWUFTbnovU0tHdnF0Z3AxVmV6d0tCZ0RvTApET3grL0dnRTNJdERIYVlZOUhDS1lVcTVDaTdlTmlqN1JTN1lRNGlmWnpNTmR5Z2VIN0pVQXh1Smx6aDhJc0RVCjVnazJaOTJ6ZUdGcVlMcW9VNVloYUM1SmEySzY4bXdGemNIbFZ0OXNrTUpxVWRtMFI4eDVKWkJNS0NrZlRhQSsKdjlMc0JZNUV2OGIyeEcydXJOaFRnRXlsMDJqUEpoNit5WnRhenRoSkFvR0FIUklYL1cwSWx5YUxubzdXekF3TQpsU3NOZkpwVHZabWtyaTBVT0dYTTJZYUt1UVo2NTJ0NkVCRHRmTTdPMTZlVjNLTkJibHQxTGpJdHovUzhraUZpClE4dEdsdU8yN0huNS9hdWl4SmpsY1puem9VWHJFakFyYThsbWdBbzQxRG0waWNEcExVemhpeFowcVM4ZDZZZnAKUklUMUlvV1N1dTJmdk9PdnFlenE2Ymc9Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K \ No newline at end of file