Este documento explica cómo desarrollar y probar el proyecto con los contenedores definidos en
docker-compose.yml, y cómo conectarte a la base de datos desde tu máquina (fuera de la red interna de Docker).
Complementa la guía Docker, la referencia API y el manual de pruebas.
Índice API Docker Base de datos Manual QA
ArcorGev5Reparto: reportes y pantallas deben leer tablas con prefijo
E_ (datos validados). Las tablas D_ son descargas móviles, a veces incompletas — no usarlas en la UI.
Detalle en base_datos_arcor_gev5.html.
1. Requisitos
- Docker Desktop o Docker Engine + Compose v2.
- RAM: al menos 4 GB libres (recomendado 6 GB+ para SQL Server 2022).
- Para desarrollo híbrido (API/web en host): .NET 8 SDK y Node.js 20+ con npm.
- Cliente SQL opcional: Azure Data Studio, DBeaver, SSMS o
sqlcmd.
sa publicada en este repo no debe usarse en producción ni exponerse en redes no confiables.
2. Arquitectura del stack Docker
| Servicio Compose | Imagen / build | Puerto host | Puerto interno |
|---|---|---|---|
web |
src/Web/Dockerfile (Node build + nginx) |
3000 | 80 |
api |
src/GoTruckBackoffice.Api/Dockerfile (.NET 8) |
5000 | 8080 |
db |
mcr.microsoft.com/mssql/server:2022-latest |
14333 | 1433 |
3. Desarrollo y pruebas con todo en Docker
3.1 Levantar el entorno
En la raíz del repositorio (donde está docker-compose.yml):
docker compose up -d --build
- La primera ejecución descarga imágenes y compila API + frontend; puede tardar varios minutos.
- El servicio
dbdebe pasar a healthy antes de que arranqueapi. - Al iniciar, la API aplica migraciones EF y crea el usuario
admin/adminsi no existe.
3.2 URLs para probar
| Qué probar | URL |
|---|---|
| Aplicación web (login + menú) | http://localhost:3000 → #/login |
| API vía mismo origen que nginx | http://localhost:3000/api/… |
| API directa (Swagger, curl) | http://localhost:5000/swagger |
| Health (sin JWT) | http://localhost:5000/api/health |
3.3 Credenciales de la aplicación
| Campo | Valor |
|---|---|
| Usuario backoffice | admin |
| Contraseña | admin |
Tras login, el token JWT se guarda en localStorage (clave gotruck_token).
3.4 Flujo de prueba recomendado (Docker completo)
docker compose ps— los tres servicios en estadorunning;dbhealthy.- Abrir
http://localhost:3000, iniciar sesión conadmin/admin. - Ir a Datos demo (API) en el menú (
#/datos-demo) y confirmar tablas con datos sembrados. - En Swagger:
POST /api/auth/login→ Authorize con Bearer → probarGET /api/catalogs/drivers(ver referencia API). - Revisar logs si algo falla:
docker compose logs -f apiodb.
3.5 Reconstruir tras cambios de código
| Cambiaste… | Comando |
|---|---|
Solo frontend (src/Web) |
docker compose up -d --build web |
Solo API (src/GoTruckBackoffice.Api) |
docker compose up -d --build api |
Ambos o docker-compose.yml |
docker compose up -d --build |
| Migraciones EF nuevas | Reconstruir api y reiniciar: docker compose up -d --build api (migran al arranque) |
3.6 Comandos útiles
# Estado y puertos
docker compose ps
# Logs en vivo
docker compose logs -f api
docker compose logs -f db
# Reiniciar un servicio
docker compose restart api
# Detener todo
docker compose down
db (sin volumen nombrado en el compose actual). Un
docker compose down seguido de eliminación del contenedor puede borrar la base; la próxima subida vuelve a migrar y sembrar.
4. Desarrollo híbrido (recomendado para iterar rápido)
Mantener solo SQL Server en Docker y correr API + frontend en el host con hot reload.
4.1 Base de datos en Docker, resto local
# Solo SQL Server
docker compose up -d db
# Esperar healthy (o: docker compose ps)
docker compose logs -f db
API (otra terminal):
cd src/GoTruckBackoffice.Api
dotnet run
Web (otra terminal):
cd src/Web
npm install
npm run dev
| Componente | URL local |
|---|---|
| SPA (Vite) | http://localhost:5173 |
| API | http://localhost:5000 (según launchSettings.json) |
| Proxy Vite → API | /api → http://127.0.0.1:5000 (vite.config.ts) |
La cadena en src/GoTruckBackoffice.Api/appsettings.json ya apunta a
Server=localhost,14333 con la misma contraseña que Docker.
4.2 Cuándo usar cada modo
| Modo | Ventaja |
|---|---|
| Todo Docker | Replica producción (nginx + API en contenedor); ideal para demo/QA integrado. |
| Híbrido (db Docker + dev local) | Recarga rápida en TypeScript y C# sin rebuild de imágenes. |
Solo db Docker + API local |
Probar migraciones y endpoints sin reconstruir web. |
5. Acceso a SQL Server desde fuera de Docker
El puerto 14333 del host se mapea al 1433 del contenedor. Cualquier herramienta en tu PC usa
localhost (o 127.0.0.1), no el hostname db (ese nombre solo resuelve dentro de la red Compose).
5.1 Datos de conexión (resumen)
| Parámetro | Valor (demo) |
|---|---|
| Servidor / host | localhost,14333 o 127.0.0.1,14333 |
| Puerto TCP | 14333 (host) → 1433 (contenedor) |
| Autenticación | SQL Server (no Windows en contenedor Linux) |
| Usuario | sa |
| Contraseña | Gotruck_Dev_2024! |
| Base de datos | GotruckDemo (creada por migraciones al arrancar la API) |
| Cifrado / certificado | Aceptar certificado no confiable / TrustServerCertificate=True |
5.2 Cadenas de conexión listas para copiar
ADO.NET / appsettings (desde el host):
Server=localhost,14333;Database=GotruckDemo;User Id=sa;Password=Gotruck_Dev_2024!;TrustServerCertificate=True;MultipleActiveResultSets=true
JDBC (DBeaver, etc.):
jdbc:sqlserver://localhost:14333;databaseName=GotruckDemo;encrypt=true;trustServerCertificate=true
Azure Data Studio / SSMS:
- Tipo: SQL Server
- Servidor:
localhost,14333 - Autenticación: SQL Server
- Login:
sa· Password:Gotruck_Dev_2024!
5.3 Probar con sqlcmd desde el host (Windows)
Si tenés sqlcmd instalado (p. ej. con SQL Server tools):
sqlcmd -S localhost,14333 -U sa -P "Gotruck_Dev_2024!" -C -Q "SELECT name FROM sys.databases"
Consultar tablas de la demo:
sqlcmd -S localhost,14333 -U sa -P "Gotruck_Dev_2024!" -C -d GotruckDemo -Q "SELECT Codigo, Nombre FROM Repartidores"
Alternativa sin sqlcmd en el host: ejecutar dentro del contenedor
docker compose exec db /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P 'Gotruck_Dev_2024!' -C -d GotruckDemo -Q "SELECT 1"
5.4 Esquema y tablas relevantes
Tras la primera migración exitosa de la API:
| Tabla | Contenido |
|---|---|
Usuarios |
Login backoffice (incluye admin con hash BCrypt) |
Repartidores |
3 filas de demo (semilla EF) |
Clientes |
4 clientes de ejemplo |
HojasReparto |
3 hojas con métricas de visitas/entregas/montos |
__EFMigrationsHistory |
Historial de migraciones aplicadas |
Ejemplo para listar usuarios (solo desarrollo):
SELECT Id, NombreUsuario, CreadoEnUtc FROM Usuarios;
5.5 Diferencia: dentro vs fuera de Docker
| Origen de la conexión | Servidor en la cadena |
|---|---|
Contenedor api |
Server=db;… (variable en docker-compose.yml) |
dotnet run en tu PC |
Server=localhost,14333;… (appsettings.json) |
| DBeaver / SSMS / sqlcmd en tu PC | localhost,14333 |
6. Probar la API con autenticación (curl)
# Login
curl -s -X POST http://localhost:5000/api/auth/login ^
-H "Content-Type: application/json" ^
-d "{\"usuario\":\"admin\",\"clave\":\"admin\"}"
# Copiar el token de la respuesta y usarlo:
curl -s http://localhost:5000/api/dashboard/summary ^
-H "Authorization: Bearer <TOKEN>"
En PowerShell podés usar Invoke-RestMethod con el mismo cuerpo JSON.
7. Solución de problemas
| Síntoma | Acción |
|---|---|
db no pasa a healthy |
Más RAM; en Apple Silicon probar platform: linux/amd64 en el servicio db; ver docker compose logs db. |
| API no conecta a SQL | Esperar healthy; docker compose restart api; revisar cadena en logs. |
| No puedo conectar desde DBeaver al host | Verificar que el contenedor expone 0.0.0.0:14333; firewall Windows; TrustServerCertificate. |
Build de web falla en Docker |
Errores TypeScript: corregir y docker compose build web; localmente npm run build en src/Web. |
| 401 en datos tras login | Token expirado o JWT mal configurado; re-login; revisar sección Jwt en appsettings.json. |
| Puerto en uso | Cambiar mapeo en docker-compose.yml (p. ej. 5001:8080) y ajustar proxy Vite si desarrollás en local. |
8. Archivos de referencia en el repo
| Archivo | Rol |
|---|---|
docker-compose.yml |
Servicios, puertos, variables de entorno de la API |
src/GoTruckBackoffice.Api/appsettings.json |
Conexión SQL desde host + JWT demo |
src/Web/nginx.conf |
Proxy /api → contenedor api:8080 |
src/Web/vite.config.ts |
Proxy dev /api → 127.0.0.1:5000 |
src/GoTruckBackoffice.Api/Data/AppDbContext.cs |
Semilla de datos demo |