Una plataforma de marketplace para ganado con autenticación, planes de suscripción y gestión de publicaciones.
- NestJS 11 - Framework Node.js
- TypeScript 5 - Lenguaje tipado
- PostgreSQL 16 - Base de datos con TypeORM
- JWT + Google OAuth 2.0 - Autenticación
- AWS S3 - Almacenamiento de imágenes
- pnpm - Gestor de paquetes
- React 19 - Librería UI
- Vite 6 - Build tool
- TailwindCSS 4 - Estilos
- TanStack Query - Estado del servidor
- Radix UI + shadcn/ui - Componentes
- Docker - Contenedores
- Caddy - Servidor web con HTTPS automático
- PostgreSQL - Base de datos
┌─────────────────────────────────────────────────────────────┐
│ Internet │
└─────────────────────────┬───────────────────────────────────┘
│
┌────────────────┴────────────────┐
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ Frontend │ │ Backend │
│ (Caddy:80/443) │───────────────│ (Node:3000) │
│ React + Vite │ API Calls │ NestJS │
└─────────────────┘ └────────┬────────┘
│
▼
┌─────────────────┐
│ PostgreSQL │
│ (DB:5432) │
└─────────────────┘
│
▼
┌─────────────────┐
│ AWS S3 │
│ (Imágenes) │
└─────────────────┘
# Clonar el repositorio
git clone <repo-url>
cd Base-Nest
# Copiar archivo de entorno
cp .env.example .env
# Editar .env con tus credenciales
nano .env# Construir y levantar todos los servicios
docker compose up -d
# Ver logs
docker compose logs -f
# Ver logs de un servicio específico
docker compose logs -f backend
docker compose logs -f frontend- Frontend: http://localhost (puerto 80)
- Backend API: http://localhost:3000
- PostgreSQL: localhost:5432
# Parar todos los servicios
docker compose down
# Reconstruir imágenes
docker compose build
# Reconstruir y levantar
docker compose up -d --build
# Ver estado de los servicios
docker compose ps
# Limpiar volúmenes (⚠️ borra datos)
docker compose down -v- Node.js 20+
- pnpm
- Docker (para PostgreSQL)
cd backend
# Instalar dependencias
pnpm install
# Configurar entorno
cp .env.example .env
# Levantar PostgreSQL
docker compose up -d postgres
# Ejecutar en desarrollo
pnpm start:devcd frontend
# Instalar dependencias
pnpm install
# Configurar entorno
cp .env.example .env
# Ejecutar en desarrollo
pnpm dev# Base de datos
DB_HOST=postgres
DB_PORT=5432
DB_USERNAME=postgres
DB_PASSWORD=tu-password-seguro
DB_NAME=mercado_ganadero
# JWT
ACCESS_JWT_SECRET=tu-secret-access-muy-seguro
ACCESS_JWT_EXPIRE_IN=900
REFRESH_JWT_SECRET=tu-secret-refresh-muy-seguro
REFRESH_JWT_EXPIRE_IN=604800
# Google OAuth
GOOGLE_CLIENT_ID=tu-client-id.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=tu-client-secret
# AWS S3
AWS_REGION=us-east-1
AWS_ACCESS_KEY_ID=tu-access-key
AWS_SECRET_ACCESS_KEY=tu-secret-key
AWS_S3_BUCKET_NAME=tu-bucket
# URLs
FRONTEND_URL=http://localhost
VITE_API_URL=http://localhost:3000Base-Nest/
├── backend/ # API NestJS
│ ├── src/
│ │ ├── auth/ # Autenticación (JWT, Google OAuth)
│ │ ├── user/ # Gestión de usuarios
│ │ ├── posts/ # Publicaciones y conexiones
│ │ ├── plans/ # Planes de suscripción
│ │ └── s3-service/ # Servicio AWS S3
│ ├── Dockerfile
│ └── docker-compose.yml # Solo PostgreSQL
│
├── frontend/ # React SPA
│ ├── src/
│ │ ├── components/ # Componentes UI
│ │ ├── pages/ # Páginas de la app
│ │ ├── contexts/ # Contextos React
│ │ └── utils/ # Utilidades
│ ├── Dockerfile
│ └── Caddyfile # Configuración Caddy
│
├── docker-compose.yml # Stack completo
├── .env.example # Template de variables
└── README.md # Este archivo
| Módulo | Endpoint | Descripción |
|---|---|---|
| Auth | GET /auth/google/login |
Iniciar login con Google |
| Auth | POST /auth/refresh |
Renovar token |
| User | GET /user/profile |
Obtener perfil |
| Posts | GET /posts |
Listar publicaciones |
| Posts | POST /posts |
Crear publicación |
| Plans | GET /plans |
Listar planes |
| Subscriptions | GET /subscriptions/my |
Mi suscripción |
Ver documentación completa en backend/README.md.
El frontend usa Caddy, que obtiene certificados TLS automáticamente. Para habilitar HTTPS:
- Editar
frontend/Caddyfile - Descomentar el bloque de producción y configurar tu dominio
- Asegurar que los puertos 80 y 443 estén abiertos
tudominio.com {
root * /srv
encode gzip
try_files {path} /index.html
file_server
}
Privado - Todos los derechos reservados