Guía de instalación (paso a paso)
Esta guía está pensada para quien nunca ha trabajado con el proyecto. Si solo quieres un resumen técnico, ve al README del repositorio.
Al terminar tendrás:
- MongoDB, Redis y RabbitMQ en Docker
- La API corriendo en
http://localhost:5012 - (Opcional) Hooks de Git y tests locales configurados
Qué necesitas instalar
| Herramienta | Obligatorio | Para qué |
|---|---|---|
| Git | Sí | Clonar el repositorio |
| Docker Desktop o Docker Engine + Compose | Sí | Base de datos, Redis, RabbitMQ |
| .NET SDK 10 | Sí (si ejecutas la API con make run) |
Compilar y ejecutar la API en tu PC |
| GNU Make | Sí en Linux/WSL | Comandos make up, make run, etc. |
Windows: usa WSL2 con Ubuntu. El Makefile no funciona bien en PowerShell sin WSL.
Checklist antes de empezar
Marca mentalmente cada punto:
- Tienes Git instalado
- Docker está encendido (
docker psno da error) - Tienes .NET 10 (
dotnet --versionmuestra10.x) - Tienes Make (
make --version) - Los puertos 27017, 6379, 5672 y 5012 están libres (o sabes qué proceso los usa)
Paso 1 — Clonar el repositorio
git clone https://github.com/DaR3kDev/uni-chat-backend.git
cd uni-chat-backend/uni-chat-backend
¿Por qué uni-chat-backend/uni-chat-backend?
- La raíz del repo contiene el README,
docs/,.github/y scripts. - La carpeta interior
uni-chat-backend/es donde viven el código .NET, elMakefileydocker-compose.yml. - Todos los comandos
makese ejecutan desde la carpeta interior.
Comprueba que estás en el sitio correcto:
pwd
# Debe terminar en .../uni-chat-backend/uni-chat-backend
ls Makefile docker-compose.yml
Paso 2 — Instalar herramientas (WSL / Ubuntu)
.NET 10
Opción A — instalador oficial desde dotnet.microsoft.com.
Opción B — script en WSL:
curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel 10.0
echo 'export PATH="$HOME/.dotnet:$PATH"' >> ~/.bashrc
source ~/.bashrc
dotnet --version
Docker
Instala Docker Desktop (Windows/Mac) o Docker Engine en Linux. Verifica:
docker compose version
docker ps
Make
sudo apt update
sudo apt install -y build-essential
make --version
Paso 3 — Configurar variables locales
Hay dos archivos según cómo ejecutes la API:
| Archivo | Cuándo |
|---|---|
.env |
Docker Compose (make up, make docker-up) |
appsettings.json |
API en tu máquina (make run) |
Opción A — Rápida para desarrollo (recomendada)
Usa valores de prueba ya preparados:
cp .env.ci.example .env
Edita .env solo si vas a usar Cloudinary de verdad (subida de archivos). Si no, puedes dejar los placeholders y probar el resto de la API.
Alinea appsettings.json para que la API en el host use localhost (servicios Docker):
{
"Mongo": {
"ConnectionString": "mongodb://admin:admin123@localhost:27017/?authSource=admin",
"Database": "chat_db"
},
"Redis": {
"ConnectionString": "localhost:6379"
},
"RabbitMQ": {
"ConnectionString": "amqp://guest:guest@localhost:5672"
},
"Jwt": {
"Key": "ci-only-fake-jwt-key-minimum-32-characters-long",
"Issuer": "uni-chat",
"Audience": "uni-chat-users",
"ExpireMinutes": 15
},
"RefreshToken": {
"ExpireDays": 7
},
"Cloudinary": {
"CloudName": "tu-cloud-name",
"ApiKey": "tu-api-key",
"ApiSecret": "tu-api-secret"
}
}
Los valores de Mongo deben coincidir con MONGO_ROOT_* de tu .env.
Opción B — Plantilla vacía
make setup
Abre .env y rellena cada variable siguiendo los comentarios de .env.example.
Archivos que NUNCA debes subir a Git
.env(contiene contraseñas)- Claves JWT o secrets de Cloudinary en commits
El hook pre-commit bloquea commitear .env si lo añades por error.
Paso 4 — Levantar servicios (Docker)
Desde uni-chat-backend/:
make up
make ps
Si algo falla:
make logs
make down
make up
URLs útiles (con make up)
| Servicio | URL / puerto |
|---|---|
| MongoDB | localhost:27017 |
| Redis | localhost:6379 |
| RabbitMQ | localhost:5672 |
| RabbitMQ UI | http://localhost:15672 |
| mongo-express | http://localhost:8081 |
| RedisInsight | http://localhost:5540 |
| Seq (logs) | http://localhost:5341 |
| Dozzle | http://localhost:8083 |
| Portainer | http://localhost:9000 |
Ver tabla visual:
make ports
Paso 5 — Arrancar la API
Modo habitual (API en tu PC, infra en Docker)
make run
Abre en el navegador: http://localhost:5012
- Documentación interactiva (Scalar): http://localhost:5012/scalar/v1 (entorno
Development) - SignalR (chat en tiempo real): hub
/messages/chat(requiere JWT)
Atajo todo-en-uno
Si aún no tienes .env:
make dev
Equivale a setup + up + run (la terminal queda ocupada con la API; Ctrl+C para parar).
Modo alternativo — API también en Docker
make docker-up
API en http://localhost:8080. En este modo la API lee variables de .env con hosts mongodb, redis, rabbitmq (no localhost).
Paso 6 — Hooks de Git y calidad de código
Una vez por clon del repo:
make install-hooks
Qué hace:
- En cada
git commit: ejecutamake pre-commit(lint + build + test) y rechaza commits que incluyan.env. - Antes de
git push, conviene ejecutar el pipeline completo:
make ci
| Comando | Qué incluye |
|---|---|
make pre-commit |
lint + build + test |
make ci |
restore + lint + build + test (igual que GitHub Actions) |
Si make lint falla:
make lint-fix
git add -A
git commit -m "tu mensaje"
Paso 7 — Documentación del proyecto (opcional)
La documentación se publica en GitHub Pages: /uni-chat-backend/
Para previsualizar en local: make docs-install y make docs (ver Editar documentación).
Producción con imagen Docker (GHCR)
En cada push a main, GitHub publica imágenes en GHCR (latest, rama main, SHA del commit). Detalle del pipeline: CI/CD.
Descargar y usar la imagen
-
Crea
.envcon variables de producción (oscripts/render-env.shcon secrets; ver CI/CD y secrets). -
Ejemplo de
docker-compose.prod.yml(en tu servidor):
services:
mongodb:
image: mongo:latest
container_name: mongodb
restart: unless-stopped
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_ROOT_USERNAME}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_ROOT_PASSWORD}
ports:
- "27017:27017"
volumes:
- mongodb_data:/data/db
redis:
image: redis:7-alpine
container_name: redis
restart: unless-stopped
ports:
- "6379:6379"
rabbitmq:
image: rabbitmq:3-management
container_name: rabbitmq
restart: unless-stopped
environment:
RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASS}
ports:
- "5672:5672"
- "15672:15672"
api:
image: ghcr.io/dar3kdev/uni-chat-backend:latest
container_name: uni-chat-api
restart: unless-stopped
environment:
Mongo__ConnectionString: ${MONGO_CONNECTION_STRING}
Mongo__Database: ${MONGO_DATABASE}
Redis__ConnectionString: ${REDIS_CONNECTION_STRING}
RabbitMQ__ConnectionString: ${RABBITMQ_CONNECTION_STRING}
Jwt__Key: ${JWT_KEY}
Jwt__Issuer: ${JWT_ISSUER}
Jwt__Audience: ${JWT_AUDIENCE}
Jwt__ExpireMinutes: ${JWT_EXPIRE_MINUTES}
RefreshToken__ExpireDays: ${REFRESH_EXPIRE_DAYS}
Cloudinary__CloudName: ${CLOUDINARY_CLOUD_NAME}
Cloudinary__ApiKey: ${CLOUDINARY_API_KEY}
Cloudinary__ApiSecret: ${CLOUDINARY_API_SECRET}
ports:
- "8080:8080"
depends_on:
- mongodb
- redis
- rabbitmq
volumes:
mongodb_data:
- Ejecutar:
docker compose -f docker-compose.prod.yml up -d
Imagen privada en GHCR:
echo $GITHUB_TOKEN | docker login ghcr.io -u TU_USUARIO --password-stdin
Errores frecuentes
| Problema | Solución |
|---|---|
dotnet: command not found |
Instala .NET 10 y export PATH="$HOME/.dotnet:$PATH" en ~/.bashrc |
make: command not found |
En Windows usa WSL; en Ubuntu: sudo apt install build-essential |
docker: Cannot connect to daemon |
Abre Docker Desktop o inicia el servicio docker |
| Puerto en uso | make down o docker compose down; revisa make ps |
| API no conecta a Mongo | Con make run, appsettings.json debe usar localhost. Con docker-up, .env debe usar mongodb, redis, rabbitmq |
make lint falla en commit |
make lint-fix y vuelve a commitear |
Syntax error: "(" unexpected en make |
Actualiza el repo; no uses paréntesis rotos en mensajes del Makefile |
Commit rechazado por .env |
Quita .env del staging: git reset HEAD .env |
make ci lento |
Normal la primera vez; usa cache de NuGet después |
Más detalle en el README — Solución de problemas.
Siguiente lectura
| Tema | Enlace |
|---|---|
| Resumen del repo | README en GitHub |
| Endpoints y SignalR | Backend |
| Arquitectura y E2EE | Chat privado |
| CI/CD y GHCR | CI/CD |
| Secrets y deploy | CI/CD y secrets |