- Docker y Docker Compose (recomendado para ejecución rápida)
- .NET SDK 8.0 o superior (para ejecución local sin Docker)
- MongoDB 5.0+ (si se ejecuta fuera de Docker) - Se recomienda MongoDB 6.0
- RabbitMQ (opcional, para integración con mensajería)
- Git (para clonar el repositorio)
| Variable | Descripción | Valor por Defecto | Requerida | Ejemplo |
|---|---|---|---|---|
ASPNETCORE_URLS |
URLs donde escucha la API | http://+:80 (Docker) / https://localhost:5001;http://localhost:5000 (Local) |
No | http://+:8080 |
ASPNETCORE_ENVIRONMENT |
Entorno de ejecución | Production |
No | Development, Staging, Production |
MongoDbSettings__ConnectionString |
Cadena de conexión a MongoDB | mongodb://localhost:27017 |
Sí | mongodb://user:pass@mongo:27017 |
MongoDbSettings__DatabaseName |
Nombre de la base de datos | - | Sí | forumsdb |
RabbitMqSettings__Host |
Host de RabbitMQ | localhost |
No | rabbitmq, amqp.example.com |
RabbitMqSettings__Username |
Usuario de RabbitMQ | - | No | guest, admin |
RabbitMqSettings__Password |
Contraseña de RabbitMQ | - | No | guest, secret123 |
TicketsService__BaseUrl |
URL base del servicio de tickets | http://localhost:5005/ |
No | http://tickets-service:80/ |
Logging__LogLevel__Default |
Nivel de logs por defecto | Information |
No | Debug, Information, Warning |
Logging__LogLevel__Microsoft |
Nivel de logs de Microsoft | Warning |
No | Information, Warning, Error |
El archivo src/forums-service.Api/appsettings.json contiene la configuración base:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ConnectionStrings": {
"MongoDb": "mongodb://<username>:<password>@localhost:27017/<database>?authSource=admin"
},
"MongoDbSettings": {
"DatabaseName": "<database>",
"ConnectionString": "mongodb://<username>:<password>@localhost:27017"
},
"RabbitMqSettings": {
"Host": "localhost",
"Username": "<username>",
"Password": "<password>"
},
"TicketsService": {
"BaseUrl": "http://localhost:5005/"
},
"AllowedHosts": "*"
}
⚠️ IMPORTANTE: No commitear credenciales reales. Usar variables de entorno o secretos en producción.
En .NET Core, las variables de entorno sobrescriben valores de appsettings.json usando el patrón __ (doble guion bajo):
Ejemplo en Linux/Mac:
export MongoDbSettings__ConnectionString="mongodb://root:example@localhost:27017"
export MongoDbSettings__DatabaseName="forumsdb"
export RabbitMqSettings__Host="rabbitmq"
export RabbitMqSettings__Username="guest"
export RabbitMqSettings__Password="guest"Ejemplo en Windows (PowerShell):
$env:MongoDbSettings__ConnectionString="mongodb://root:example@localhost:27017"
$env:MongoDbSettings__DatabaseName="forumsdb"Ejemplo en Docker Compose:
environment:
- MongoDbSettings__ConnectionString=mongodb://root:example@mongodb:27017
- MongoDbSettings__DatabaseName=forumsdbEl proyecto incluye un docker-compose.yml que levanta tanto MongoDB como la API:
version: '3.8'
services:
mongodb:
image: mongo:latest
container_name: forums_service_mongo
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
ports:
- "27017:27017"
volumes:
- mongo_data:/data/db
forums-service:
build:
context: .
dockerfile: Dockerfile
container_name: forums_service_api
depends_on:
- mongodb
environment:
ASPNETCORE_URLS: http://+:80
MongoDbSettings__ConnectionString: mongodb://root:example@mongodb:27017/?authSource=admin
MongoDbSettings__DatabaseName: forumsdb
TicketsService__BaseUrl: http://host.docker.internal:5005/
ports:
- "8082:80"
volumes:
mongo_data:docker-compose up -d- MongoDB: Disponible en
localhost:27017 - API: Disponible en
http://localhost:8082 - Swagger:
http://localhost:8082/swagger
docker-compose logs -f forums-servicedocker-compose logs -f mongodbdocker-compose downdocker-compose down -vdocker-compose build forums-service
docker-compose up -d forums-servicedocker-compose up -d mongodb# Etapa 1: Build
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
# Copiar todo el código fuente
COPY . ./
# Restaurar dependencias y compilar
WORKDIR /src/src/forums-service.Api
RUN dotnet restore
RUN dotnet publish -c Release -o /app/publish
# Etapa 2: Runtime
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app
# Copiar binarios compilados
COPY --from=build /app/publish ./
# Configurar puerto
ENV ASPNETCORE_URLS=http://+:80
# Ejecutar la aplicación
ENTRYPOINT ["dotnet", "forums_service.Api.dll"]Etapas:
- build: Usa la imagen SDK completa para compilar el código
- runtime: Usa la imagen ASP.NET más ligera para ejecutar la aplicación compilada
Ventajas:
- Imagen final más pequeña (~200MB vs ~700MB)
- Mayor seguridad (no incluye herramientas de compilación)
docker build -t forums-service:latest .docker run -d \
--name forums-service \
-p 8082:80 \
-e MongoDbSettings__ConnectionString="mongodb://root:example@host.docker.internal:27017" \
-e MongoDbSettings__DatabaseName="forumsdb" \
forums-service:latestWindows/Mac: Descargar desde https://dotnet.microsoft.com/download
Linux (Ubuntu/Debian):
wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt update
sudo apt install -y dotnet-sdk-8.0Verificar instalación:
dotnet --versiondocker run -d \
--name mongodb \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=root \
-e MONGO_INITDB_ROOT_PASSWORD=example \
mongo:latest
⚠️ Nota: Las instrucciones pueden variar según la versión de Ubuntu. A continuación se muestran comandos para Ubuntu 20.04/22.04.
# Para Ubuntu 22.04 (Jammy) - Instalar gnupg
sudo apt-get install -y gnupg curl
# Importar clave GPG de MongoDB (método actualizado)
curl -fsSL https://www.mongodb.org/static/pgp/server-6.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg \
--dearmor
# Verificar que la clave fue importada correctamente
if [ -f /usr/share/keyrings/mongodb-server-6.0.gpg ]; then
echo "✅ Clave GPG importada correctamente"
else
echo "❌ Error al importar la clave GPG"
exit 1
fi
# Crear lista de sources (Ubuntu 22.04)
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
# Para Ubuntu 20.04, usar 'focal' en lugar de 'jammy'
# echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
# Instalar MongoDB
sudo apt update
sudo apt install -y mongodb-org
# Iniciar el servicio
sudo systemctl start mongod
sudo systemctl enable mongod
# Verificar que está corriendo
sudo systemctl status mongodEditar src/forums-service.Api/appsettings.json:
{
"MongoDbSettings": {
"DatabaseName": "forumsdb",
"ConnectionString": "mongodb://root:example@localhost:27017/?authSource=admin"
}
}cd /ruta/al/proyecto
dotnet restoredotnet run --project src/forums-service.Api/forums-service.Api.csprojURLs:
- HTTPS:
https://localhost:5001 - HTTP:
http://localhost:5000 - Swagger:
https://localhost:5001/swagger
Si aparece error de certificado HTTPS:
dotnet dev-certs https --trustEl proyecto usa comandos de .NET CLI estándar:
| Comando | Descripción | Ejemplo |
|---|---|---|
dotnet restore |
Restaura dependencias NuGet | dotnet restore |
dotnet build |
Compila el proyecto | dotnet build -c Release |
dotnet run |
Ejecuta la aplicación | dotnet run --project src/forums-service.Api |
dotnet test |
Ejecuta todos los tests | dotnet test |
dotnet publish |
Publica la aplicación | dotnet publish -c Release -o ./publish |
dotnet clean |
Limpia archivos de compilación | dotnet clean |
dotnet build forums-service.slndotnet build src/forums-service.Api/forums-service.Api.csprojdotnet test /p:CollectCoverage=true /p:CoverageReportFormat=opencoverdotnet test tests/forums-service.Domain.Tests/forums-service.Domain.Tests.csprojdotnet publish -c Release -r linux-x64 --self-containeddotnet sln forums-service.sln listPuedes crear un Makefile para simplificar comandos comunes:
.PHONY: build test run docker-up docker-down clean
build:
dotnet build -c Release
test:
dotnet test
run:
dotnet run --project src/forums-service.Api/forums-service.Api.csproj
docker-up:
docker-compose up -d
docker-down:
docker-compose down
docker-logs:
docker-compose logs -f forums-service
clean:
dotnet clean
rm -rf **/bin **/obj
restore:
dotnet restoreUso:
make build
make test
make docker-upCausa: MongoDB no está corriendo o la cadena de conexión es incorrecta.
Solución:
# Verificar que MongoDB está corriendo
docker ps | grep mongo
# O en local
sudo systemctl status mongod
# Verificar conectividad
mongo --host localhost --port 27017 -u root -p exampleCausa: Otro servicio está usando el puerto.
Solución:
# Ver qué proceso usa el puerto
sudo lsof -i :8082
# O cambiar el puerto en docker-compose.yml
ports:
- "8083:80" # Usar puerto 8083 en lugar de 8082Causa: Faltan variables de configuración requeridas.
Solución: Asegúrate de tener configurado:
MongoDbSettings__ConnectionStringMongoDbSettings__DatabaseName
Causa: Certificado de desarrollo no instalado.
Solución:
dotnet dev-certs https --clean
dotnet dev-certs https --trustCausa: Nivel de logs muy alto.
Solución: Cambiar nivel de logs en docker-compose.yml:
environment:
- Logging__LogLevel__Default=Debug- Usar secretos externos (Azure Key Vault, AWS Secrets Manager, etc.)
- Habilitar HTTPS/TLS
- Configurar CORS si se consume desde frontend
- Implementar autenticación/autorización (JWT, OAuth2)
- Configurar rate limiting
- Habilitar logging estructurado (Serilog + ELK/Seq)
- Configurar health checks (
/health) - Implementar circuit breaker para llamadas externas
- Configurar monitoring (Prometheus + Grafana)
- Habilitar tracing distribuido (OpenTelemetry)
# Configurar connection string como secreto
az webapp config appsettings set \
--resource-group myResourceGroup \
--name forums-service \
--settings \
MongoDbSettings__ConnectionString="mongodb+srv://user:pass@cluster.mongodb.net" \
MongoDbSettings__DatabaseName="forumsdb" \
ASPNETCORE_ENVIRONMENT="Production"apiVersion: v1
kind: Secret
metadata:
name: forums-service-secrets
type: Opaque
stringData:
mongodb-connection: "mongodb://user:pass@mongo-service:27017"
mongodb-database: "forumsdb"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: forums-service
spec:
replicas: 3
selector:
matchLabels:
app: forums-service
template:
metadata:
labels:
app: forums-service
spec:
containers:
- name: forums-service
image: myregistry/forums-service:latest
ports:
- containerPort: 80
env:
- name: MongoDbSettings__ConnectionString
valueFrom:
secretKeyRef:
name: forums-service-secrets
key: mongodb-connection
- name: MongoDbSettings__DatabaseName
valueFrom:
secretKeyRef:
name: forums-service-secrets
key: mongodb-database
- name: ASPNETCORE_ENVIRONMENT
value: "Production"Agregar en Program.cs:
builder.Services.AddHealthChecks()
.AddMongoDb(
mongodbConnectionString: builder.Configuration["MongoDbSettings:ConnectionString"],
name: "mongodb",
timeout: TimeSpan.FromSeconds(3));
app.MapHealthChecks("/health");Verificar:
curl http://localhost:8082/healthdotnet add package Serilog.AspNetCore
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.FileProgram.cs:
using Serilog;
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.File("logs/forums-service-.log", rollingInterval: RollingInterval.Day)
.CreateLogger();
builder.Host.UseSerilog();# Quick Start con Docker
docker-compose up -d
# Desarrollo Local
dotnet restore
dotnet run --project src/forums-service.Api
# Tests
dotnet test
# Compilar para producción
dotnet publish -c Release -o ./publish
# Docker manual
docker build -t forums-service .
docker run -p 8082:80 forums-service
# Ver logs
docker-compose logs -f forums-service
# Detener todo
docker-compose down