Skip to content

marcGarcias/digital-xis

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

71 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Status Repo Size Top Language License

🚀 Digital Xis

A full-stack digital marketing web platform built for performance, SEO, and modern user experience — powered by Angular SSR, Spring Boot, and Strapi CMS.

📖 About🔄 Flow🛠️ Tech Stack⚙️ Setup🚀 Run🧪 Tests📡 API🗂️ Structure🚢 Deploy⚠️ Issues


📖 About

Digital Xis is a dynamic, server-side rendered (SSR) landing page focused on the digital marketing domain. It is designed to deliver high performance, strong online presence, SEO optimization, and a secure, scalable architecture. The platform is divided into three independent, production-ready layers:

Layer Technology Purpose
Front-end Angular 21 + SSR Server-side rendered SPA with smooth UX and SEO
Back-end Spring Boot 4 + Java 21 REST API with security, rate limiting, caching, and email
CMS Strapi 5 Headless content management for dynamic page sections

The architecture follows a headless CMS pattern: all page content (carousel, about, reviews, FAQ, business info) is managed in Strapi, served through the Spring Boot API (which acts as a secure proxy and cache layer), and rendered by the Angular SSR front-end.

Key capabilities:

  • Angular SSR — server-side rendering for fast first paint and crawlable HTML
  • Redis caching — API responses are cached to minimize Strapi round-trips
  • Bucket4j rate limiting — protects all endpoints from abuse and DDoS
  • Cloudflare Turnstile — bot-protection captcha on the contact form
  • Spring Security — headers hardening, CORS policy, session security
  • Jsoup sanitization — all user inputs are sanitized before processing

🔄 Project Flow

flowchart LR
    User([👤 User]) -->|HTTPS| FE["Angular SSR"]
    FE --> HTML["HTML + CSS"]
    HTML -->|API| API["Spring Boot"]

    API --> SEC["🔒 Spring Security\n(CORS · Rate Limit · CAPTCHA)"]
    SEC --> CTL["Controllers"]

    CTL --> CACHE{{"Redis Cache"}}
    CACHE -->|HIT| CTL
    CACHE -->|MISS| CMS["Strapi CMS"]
    CMS -->|Data| CACHE

    CTL --> MAIL["SMTP (Email)"]

    CTL -->|Response| FE
Loading

🛠️ Tech Stack

Front-end

Technology :---: Purpose
Angular 21 🔗 21.0.0 SPA framework with component architecture
Angular SSR 🔗 21.0.4 Server-side rendering via Express
Express 🔗 5.1.0 Node.js HTTP server for SSR
Lenis 🔗 1.3.18 Native smooth scroll library
RxJS 🔗 7.8.0 Reactive programming for HTTP streams
TypeScript 🔗 5.9.2 Strictly typed JavaScript
Vitest 🔗 4.0.8 Unit testing framework

Back-end

Technology Version Purpose
Java 🔗 21 LTS Platform language (LTS)
Spring Boot 🔗 4.0.4 Application framework
Spring WebMVC 🔗 4.0.4 REST controllers and servlet layer
Spring Security 🔗 4.0.4 CORS, headers hardening, session security
Spring Mail 🔗 4.0.4 Email delivery via SMTP
Spring Data Redis 🔗 4.0.4 Reactive Redis cache integration
Spring WebClient 🔗 4.0.4 Non-blocking HTTP client for CMS calls
Bucket4j 🔗 8.5.0 Token-bucket rate limiting
Lombok 🔗 (managed) Boilerplate reduction annotations
MapStruct 🔗 1.6.3 DTO ↔ domain object mapping
Jsoup 🔗 1.17.2 HTML sanitization for user inputs
Springdoc OpenAPI 🔗 3.0.2 Swagger / OpenAPI documentation
Maven 🔗 3.9.14 Dependency management and build

CMS

Technology Version Purpose
Strapi 🔗 5.36.1 Headless CMS with REST API
better-sqlite3 🔗 12.4.1 Embedded SQLite database driver
Node.js 🔗 ≥ 20 CMS runtime

Infrastructure

Technology Version Purpose
Docker 🔗 Latest Container build and orchestration
Redis 🔗 7 In-memory API response cache
Vercel 🔗 Front-end SSR deployment platform

📦 Dependencies

Front-end (front-end/package.json)

Package Version Link
@angular/core ^21.0.0 🔗
@angular/ssr ^21.0.4 🔗
express ^5.1.0 🔗
lenis ^1.3.18 🔗
rxjs ~7.8.0 🔗
vitest ^4.0.8 🔗

Back-end (back-end/pom.xml)

Artifact Version Link
spring-boot-starter-webmvc 4.0.4 🔗
spring-boot-starter-security 4.0.4 🔗
spring-boot-starter-data-redis-reactive 4.0.4 🔗
spring-boot-starter-mail 4.0.4 🔗
bucket4j-core 8.5.0 🔗
mapstruct 1.6.3 🔗
jsoup 1.17.2 🔗
springdoc-openapi-starter-webmvc-ui 3.0.2 🔗

✅ Prerequisites

Tool Version Link
Node.js 🔗 ≥ 20.x Required for front-end and CMS
npm 🔗 ≥ 6.x Package manager
Java JDK 🔗 21 LTS Required for back-end
Maven 🔗 ≥ 3.9 Build tool (or use ./mvnw)
Docker 🔗 Latest Container runtime
Redis 🔗 ≥ 7 Cache (or run via Docker Compose)

⚙️ Environment Setup

Back-end (back-end/)

Create an .env file or export the following variables before running:

MAIL_PORT=587
MAIL_USER=your-gmail@gmail.com
MAIL_PASS=your-gmail-app-password

CMS_HOST=http://localhost:1337

CAPTCHA_SECRET_KEY=your-cloudflare-turnstile-secret

CACHE_HOST=localhost
CACHE_PORT=6379

CMS (cms-strapi/)

Copy the example file and fill in the secrets:

cp cms-strapi/.env.example cms-strapi/.env
HOST=0.0.0.0
PORT=1337
APP_KEYS="key1,key2"
API_TOKEN_SALT=your-salt
ADMIN_JWT_SECRET=your-admin-secret
TRANSFER_TOKEN_SALT=your-transfer-salt
JWT_SECRET=your-jwt-secret
ENCRYPTION_KEY=your-encryption-key

🚀 How to Run

1. Clone the repository

git clone https://github.com/marcGarcias/digital-xis.git
cd digital-xis

2. Start the CMS (Strapi)

cd cms-strapi
npm install
npm run dev
# CMS Admin → http://localhost:1337/admin

3. Start Redis (via Docker Compose)

cd back-end
docker compose up redis -d

4. Start the Back-end

cd back-end
./mvnw spring-boot:run
# API → http://localhost:8080

5. Start the Front-end

cd front-end
npm install
npm start
# App → http://localhost:4200

Run with Docker (Back-end + Redis)

cd back-end
docker compose up --build

Build the Front-end SSR image

cd front-end
docker build -t digital-xis-frontend .
docker run -p 4200:4200 digital-xis-frontend

🧪 Tests

Front-end (Vitest)

cd front-end
npm test
📋 Expected output
 ✓ src/app/app.spec.ts (1 test)
   ✓ AppComponent should create the app

Test Files  1 passed
Tests       1 passed
Duration    ~1.2s

Back-end (JUnit + Spring Boot Test)

cd back-end
./mvnw test
📋 Expected output
[INFO] Tests run: X, Failures: 0, Errors: 0, Skipped: 0
[INFO] BUILD SUCCESS

📡 API Routes

Base URL: http://localhost:8080

CMS Content

Method Route Description
GET /api/content/carousel Returns carousel items for the homepage
GET /api/content/about Returns the "About Us" section content
GET /api/content/review Returns customer reviews and testimonials
GET /api/content/faq Returns the frequently asked questions list
GET /api/content/info Returns general business information

Contact

Method Route Description
POST /api/contact Submits a contact form message via email

Proxy

Method Route Description
GET /uploads/** Proxies static assets (images) from Strapi CMS

📨 POST /api/contact — Example Request & Response

Request:

POST /api/contact
Content-Type: application/json

{
  "name": "João Silva",
  "email": "joao@example.com",
  "subject": "Budget request",
  "message": "I'd like to get a quote for a landing page.",
  "turnstileToken": "CLOUDFLARE_TURNSTILE_TOKEN"
}

Response 200 OK:

{
  "success": true,
  "message": "Message sent successfully."
}

Response 400 Bad Request:

{
  "error": "Invalid or expired security verification"
}
📦 GET /api/content/carousel — Example Response

Response 200 OK:

{
  "data": [
    {
      "id": 1,
      "title": "Digital Marketing that Converts",
      "subtitle": "Accelerate your brand's online presence",
      "imageUrl": "/uploads/banner_1.webp"
    }
  ]
}

Response 502 Bad Gateway:

{
  "status": 502,
  "error": "Error communicating with CMS",
  "path": "/api/content/carousel"
}

🗂️ Project Structure

digital-xis/
├── front-end/                    # Angular 21 SSR application
│   ├── src/
│   │   ├── app/
│   │   │   ├── components/       # Shared UI components (logo, nav, footer)
│   │   │   ├── pages/            # Route-based page components
│   │   │   │   ├── home/         # Homepage
│   │   │   │   └── privacy-policy/
│   │   │   ├── models/           # TypeScript interfaces for API data
│   │   │   ├── services/         # HTTP services (CMS, contact)
│   │   │   ├── app.routes.ts     # Routing config
│   │   │   └── app.config.ts     # App providers and HTTP client
│   │   ├── styles/               # Global CSS styles
│   │   ├── server.ts             # Express SSR server entry
│   │   └── index.html            # Root HTML template (SEO meta tags)
│   ├── Dockerfile                # Multi-stage Docker build (Node 22 Alpine)
│   └── vercel.json               # Vercel deployment config
│
├── back-end/                     # Spring Boot 4 REST API
│   ├── src/main/java/dev/garcias/backend/
│   │   ├── config/
│   │   │   ├── SecurityConfig.java      # CORS, security headers, session
│   │   │   └── RateLimitFilter.java     # Bucket4j rate limiting filter
│   │   ├── controller/
│   │   │   ├── CMSController.java       # Content endpoints
│   │   │   ├── ContactController.java   # Contact form endpoint
│   │   │   └── ProxyController.java     # CMS media proxy
│   │   ├── service/                     # Business logic layer
│   │   ├── dto/                         # Request and response DTOs
│   │   ├── mapper/                      # MapStruct mappers
│   │   └── exception/                   # Global error handling
│   ├── src/main/resources/
│   │   └── application.properties       # App config and env references
│   ├── dockerfile                        # Multi-stage Docker build (Maven + JRE Alpine)
│   └── docker-compose.yml               # Redis + API services
│
└── cms-strapi/                   # Strapi 5 headless CMS
    ├── config/                   # Server, database, middlewares, plugins config
    ├── src/                      # Custom content types and extensions
    ├── database/                 # SQLite data and migrations
    ├── .env.example              # Environment variables template
    └── package.json

🚢 Deploy

Front-end → Vercel 🔗

The front-end deploys to Vercel as a containerized SSR application.

# Build for production
cd front-end
npm run build

# SSR server output
node dist/front-end/server/server.mjs
Artifact Path Notes
Browser bundle dist/front-end/browser/ Static assets
SSR server dist/front-end/server/server.mjs Node.js server

The vercel.json file at the root of front-end/ configures Vercel routing automatically.

Back-end → Docker

cd back-end

# Build image
docker build -t digital-xis-backend .

# Run with environment variables
docker run -p 8080:8080 \
  -e MAIL_PORT=587 \
  -e MAIL_USER=your@gmail.com \
  -e MAIL_PASS=your-app-password \
  -e CMS_HOST=http://your-strapi-host:1337 \
  -e CAPTCHA_SECRET_KEY=your-key \
  -e CACHE_HOST=redis \
  -e CACHE_PORT=6379 \
  digital-xis-backend

The CMS is deployable to Strapi Cloud using the built-in @strapi/plugin-cloud plugin:

cd cms-strapi
npm run deploy

⚠️ Known Issues

🐛 Redis connection required on back-end startup

The Spring Boot API requires a running Redis instance at startup. If Redis is unavailable, the application will fail to start. Always ensure the Redis container is up before starting the API.

Workaround: Use docker compose up redis -d before running the back-end.

🔮 Next Steps

  • Configure CI/CD pipeline with GitHub Actions for automated deployments

📄 License

This project is licensed under the PolyForm Noncommercial License 🔗.


made with lots of coffee — leave a ⭐ if this project helped you!

Status Tamanho do Repo Linguagem Principal Licença

🚀 Digital Xis

Plataforma web de marketing digital full-stack construída para performance, SEO e experiência de usuário moderna — com Angular SSR, Spring Boot e Strapi CMS.

📖 Sobre🔄 Fluxo🛠️ Tecnologias⚙️ Configuração🚀 Executar🧪 Testes📡 API🗂️ Estrutura🚢 Deploy⚠️ Problemas


📖 Sobre

A Digital Xis é uma landing page com renderização no servidor (SSR) e conteúdo dinâmico, voltada ao segmento de marketing digital. Foi projetada para garantir alta performance, forte presença online, otimização para SEO e uma arquitetura segura e escalável. A plataforma é dividida em três camadas independentes e prontas para produção:

Camada Tecnologia Finalidade
Front-end Angular 21 + SSR SPA com renderização no servidor, UX fluida e SEO
Back-end Spring Boot 4 + Java 21 API REST com segurança, rate limiting, cache e e-mail
CMS Strapi 5 Gerenciamento headless do conteúdo das páginas

A arquitetura segue o padrão headless CMS: todo o conteúdo das páginas (carrossel, sobre, avaliações, FAQ, informações do negócio) é gerenciado no Strapi, servido via Spring Boot API (que atua como proxy seguro e camada de cache), e renderizado pelo front-end Angular SSR.

Principais capacidades:

  • Angular SSR — renderização no servidor para primeiro carregamento rápido e HTML rastreável por bots
  • Cache Redis — respostas da API são cacheadas para minimizar chamadas ao Strapi
  • Rate limiting com Bucket4j — proteção de todos os endpoints contra abuso e DDoS
  • Cloudflare Turnstile — captcha anti-bot no formulário de contato
  • Spring Security — endurecimento de headers HTTP, política de CORS, segurança de sessão
  • Sanitização Jsoup — todos os inputs do usuário são sanitizados antes de serem processados

🔄 Fluxo do Projeto

flowchart LR
    User([👤 Usuário]) -->|HTTPS| FE["Angular SSR"]
    FE --> HTML["HTML + CSS"]
    HTML -->|API| API["Spring Boot"]

    API --> SEC["🔒 Spring Security\n(CORS · Rate Limit · CAPTCHA)"]
    SEC --> CTL["Controllers"]

    CTL --> CACHE{{"Redis Cache"}}
    CACHE -->|HIT| CTL
    CACHE -->|MISS| CMS["Strapi CMS"]
    CMS -->|Dados| CACHE

    CTL --> MAIL["SMTP (E-mail)"]

    CTL -->|Resposta| FE
Loading

🛠️ Tecnologias

Front-end

Tecnologia Versão Finalidade
Angular 21 🔗 21.0.0 Framework SPA com arquitetura de componentes
Angular SSR 🔗 21.0.4 Renderização no servidor via Express
Express 🔗 5.1.0 Servidor HTTP Node.js para SSR
Lenis 🔗 1.3.18 Biblioteca de scroll suave nativo
RxJS 🔗 7.8.0 Programação reativa para streams HTTP
TypeScript 🔗 5.9.2 JavaScript com tipagem estrita
Vitest 🔗 4.0.8 Framework de testes unitários

Back-end

Tecnologia Versão Finalidade
Java 🔗 21 LTS Linguagem principal da plataforma (LTS)
Spring Boot 🔗 4.0.4 Framework de aplicação
Spring WebMVC 🔗 4.0.4 Controllers REST e camada servlet
Spring Security 🔗 4.0.4 CORS, headers de segurança, sessão
Spring Mail 🔗 4.0.4 Envio de e-mails via SMTP
Spring Data Redis 🔗 4.0.4 Integração reativa com Redis
Spring WebClient 🔗 4.0.4 Client HTTP não-bloqueante para o CMS
Bucket4j 🔗 8.5.0 Rate limiting com algoritmo token-bucket
Lombok 🔗 (gerenciado) Redução de código boilerplate
MapStruct 🔗 1.6.3 Mapeamento DTO ↔ objetos de domínio
Jsoup 🔗 1.17.2 Sanitização de HTML nos inputs do usuário
Springdoc OpenAPI 🔗 3.0.2 Documentação Swagger / OpenAPI
Maven 🔗 3.9.14 Gerenciamento de dependências e build

CMS

Tecnologia Versão Finalidade
Strapi 🔗 5.36.1 CMS headless com API REST
better-sqlite3 🔗 12.4.1 Driver SQLite embarcado
Node.js 🔗 ≥ 20 Runtime do CMS

Infraestrutura

Tecnologia Versão Finalidade
Docker 🔗 Mais recente Build e orquestração de containers
Redis 🔗 7 Cache em memória para respostas da API
Vercel 🔗 Plataforma de deploy do front-end SSR

📦 Dependências

Front-end (front-end/package.json)

Pacote Versão Link
@angular/core ^21.0.0 🔗
@angular/ssr ^21.0.4 🔗
express ^5.1.0 🔗
lenis ^1.3.18 🔗
rxjs ~7.8.0 🔗
vitest ^4.0.8 🔗

Back-end (back-end/pom.xml)

Artefato Versão Link
spring-boot-starter-webmvc 4.0.4 🔗
spring-boot-starter-security 4.0.4 🔗
spring-boot-starter-data-redis-reactive 4.0.4 🔗
spring-boot-starter-mail 4.0.4 🔗
bucket4j-core 8.5.0 🔗
mapstruct 1.6.3 🔗
jsoup 1.17.2 🔗
springdoc-openapi-starter-webmvc-ui 3.0.2 🔗

✅ Pré-requisitos

Ferramenta Versão Link
Node.js 🔗 ≥ 20.x Necessário para o front-end e CMS
npm 🔗 ≥ 6.x Gerenciador de pacotes
Java JDK 🔗 21 LTS Necessário para o back-end
Maven 🔗 ≥ 3.9 Ferramenta de build (ou use ./mvnw)
Docker 🔗 Mais recente Runtime de containers
Redis 🔗 ≥ 7 Cache (ou use via Docker Compose)

⚙️ Configuração do Ambiente

Back-end (back-end/)

Crie um arquivo .env ou exporte as seguintes variáveis antes de executar:

MAIL_PORT=587
MAIL_USER=seu-gmail@gmail.com
MAIL_PASS=sua-senha-de-app-gmail

CMS_HOST=http://localhost:1337

CAPTCHA_SECRET_KEY=sua-chave-secreta-cloudflare-turnstile

CACHE_HOST=localhost
CACHE_PORT=6379

CMS (cms-strapi/)

Copie o arquivo de exemplo e preencha os segredos:

cp cms-strapi/.env.example cms-strapi/.env
HOST=0.0.0.0
PORT=1337
APP_KEYS="chave1,chave2"
API_TOKEN_SALT=seu-salt
ADMIN_JWT_SECRET=seu-segredo-admin
TRANSFER_TOKEN_SALT=seu-salt-de-transferencia
JWT_SECRET=seu-jwt-secret
ENCRYPTION_KEY=sua-chave-de-criptografia

🚀 Como Executar

1. Clone o repositório

git clone https://github.com/marcGarcias/digital-xis.git
cd digital-xis

2. Inicie o CMS (Strapi)

cd cms-strapi
npm install
npm run dev
# Painel Admin → http://localhost:1337/admin

3. Inicie o Redis (via Docker Compose)

cd back-end
docker compose up redis -d

4. Inicie o Back-end

cd back-end
./mvnw spring-boot:run
# API → http://localhost:8080

5. Inicie o Front-end

cd front-end
npm install
npm start
# App → http://localhost:4200

Executar com Docker (Back-end + Redis)

cd back-end
docker compose up --build

Build da imagem SSR do Front-end

cd front-end
docker build -t digital-xis-frontend .
docker run -p 4200:4200 digital-xis-frontend

🧪 Testes

Front-end (Vitest)

cd front-end
npm test
📋 Resultado esperado
 ✓ src/app/app.spec.ts (1 teste)
   ✓ AppComponent deve criar o componente

Arquivos de Teste  1 passou
Testes             1 passou
Duração            ~1.2s

Back-end (JUnit + Spring Boot Test)

cd back-end
./mvnw test
📋 Resultado esperado
[INFO] Tests run: X, Failures: 0, Errors: 0, Skipped: 0
[INFO] BUILD SUCCESS

📡 Rotas da API

URL base: http://localhost:8080

Conteúdo do CMS

Método Rota Descrição
GET /api/content/carousel Retorna os itens do carrossel da homepage
GET /api/content/about Retorna o conteúdo da seção "Sobre Nós"
GET /api/content/review Retorna avaliações e depoimentos de clientes
GET /api/content/faq Retorna a lista de perguntas frequentes
GET /api/content/info Retorna informações gerais do negócio

Contato

Método Rota Descrição
POST /api/contact Envia uma mensagem do formulário de contato via e-mail

Proxy

Método Rota Descrição
GET /uploads/** Faz proxy de assets estáticos (imagens) do Strapi CMS

📨 POST /api/contact — Exemplo de Requisição e Resposta

Requisição:

POST /api/contact
Content-Type: application/json

{
  "name": "João Silva",
  "email": "joao@exemplo.com",
  "subject": "Solicitação de orçamento",
  "message": "Gostaria de obter um orçamento para uma landing page.",
  "turnstileToken": "TOKEN_CLOUDFLARE_TURNSTILE"
}

Resposta 200 OK:

{
  "success": true,
  "message": "Message sent successfully."
}

Resposta 400 Bad Request:

{
  "error": "Invalid or expired security verification"
}
📦 GET /api/content/carousel — Exemplo de Resposta

Resposta 200 OK:

{
  "data": [
    {
      "id": 1,
      "title": "Marketing Digital que Converte",
      "subtitle": "Acelere a presença online da sua marca",
      "imageUrl": "/uploads/banner_1.webp"
    }
  ]
}

Resposta 502 Bad Gateway:

{
  "status": 502,
  "error": "Error communicating with CMS",
  "path": "/api/content/carousel"
}

🗂️ Estrutura do Projeto

digital-xis/
├── front-end/                    # Aplicação Angular 21 com SSR
│   ├── src/
│   │   ├── app/
│   │   │   ├── components/       # Componentes de UI reutilizáveis (logo, nav, rodapé)
│   │   │   ├── pages/            # Componentes de página baseados em rotas
│   │   │   │   ├── home/         # Página inicial
│   │   │   │   └── privacy-policy/
│   │   │   ├── models/           # Interfaces TypeScript para dados da API
│   │   │   ├── services/         # Serviços HTTP (CMS, contato)
│   │   │   ├── app.routes.ts     # Configuração de rotas
│   │   │   └── app.config.ts     # Providers e client HTTP
│   │   ├── styles/               # Estilos CSS globais
│   │   ├── server.ts             # Entry point do servidor Express SSR
│   │   └── index.html            # Template HTML raiz (meta tags SEO)
│   ├── Dockerfile                # Build Docker multi-estágio (Node 22 Alpine)
│   └── vercel.json               # Configuração de deploy na Vercel
│
├── back-end/                     # API REST Spring Boot 4
│   ├── src/main/java/dev/garcias/backend/
│   │   ├── config/
│   │   │   ├── SecurityConfig.java      # CORS, headers de segurança, sessão
│   │   │   └── RateLimitFilter.java     # Filtro de rate limiting com Bucket4j
│   │   ├── controller/
│   │   │   ├── CMSController.java       # Endpoints de conteúdo
│   │   │   ├── ContactController.java   # Endpoint do formulário de contato
│   │   │   └── ProxyController.java     # Proxy para mídias do CMS
│   │   ├── service/                     # Camada de lógica de negócio
│   │   ├── dto/                         # DTOs de requisição e resposta
│   │   ├── mapper/                      # Mappers MapStruct
│   │   └── exception/                   # Tratamento global de erros
│   ├── src/main/resources/
│   │   └── application.properties       # Configuração da app e variáveis de ambiente
│   ├── dockerfile                        # Build Docker multi-estágio (Maven + JRE Alpine)
│   └── docker-compose.yml               # Serviços Redis + API
│
└── cms-strapi/                   # CMS Headless Strapi 5
    ├── config/                   # Configuração de servidor, banco, middlewares e plugins
    ├── src/                      # Tipos de conteúdo customizados e extensões
    ├── database/                 # Dados SQLite e migrações
    ├── .env.example              # Template de variáveis de ambiente
    └── package.json

🚢 Deploy

Front-end → Vercel 🔗

O front-end é deployado na Vercel como aplicação SSR containerizada.

# Build para produção
cd front-end
npm run build

# Servidor SSR de saída
node dist/front-end/server/server.mjs
Artefato Caminho Observação
Bundle do browser dist/front-end/browser/ Assets estáticos
Servidor SSR dist/front-end/server/server.mjs Servidor Node.js

O arquivo vercel.json na raiz de front-end/ configura o roteamento da Vercel automaticamente.

Back-end → Docker

cd back-end

# Build da imagem
docker build -t digital-xis-backend .

# Executar com variáveis de ambiente
docker run -p 8080:8080 \
  -e MAIL_PORT=587 \
  -e MAIL_USER=seu@gmail.com \
  -e MAIL_PASS=sua-senha-de-app \
  -e CMS_HOST=http://seu-strapi:1337 \
  -e CAPTCHA_SECRET_KEY=sua-chave \
  -e CACHE_HOST=redis \
  -e CACHE_PORT=6379 \
  digital-xis-backend

O CMS pode ser deployado no Strapi Cloud usando o plugin @strapi/plugin-cloud já incluído:

cd cms-strapi
npm run deploy

⚠️ Problemas Conhecidos

🐛 Conexão Redis obrigatória na inicialização do back-end

A API Spring Boot requer uma instância Redis em execução ao iniciar. Se o Redis estiver indisponível, a aplicação não vai subir. Sempre certifique-se de que o container Redis está ativo antes de iniciar a API.

Solução: Use docker compose up redis -d antes de executar o back-end.


🔮 Próximos Passos

  • Configurar pipeline de CI/CD com GitHub Actions para deploys automatizados

📄 Licença

Este projeto está licenciado sob a PolyForm Noncommercial License 🔗.


Feito com muito ☕ — deixe uma ⭐ se este projeto te ajudou!