Primer commit

This commit is contained in:
2026-09-18 16:21:11 +00:00
parent 77e0f45118
commit df28ce57d2
4 changed files with 805 additions and 3 deletions
+50
View File
@@ -0,0 +1,50 @@
# Host port the SPA is published on.
FRONTEND_PORT=5001
# Network-private Postgres container (see the `db` service in docker-compose.yml).
# These three initialise the database on the container's FIRST start (empty data
# dir only) — POSTGRES_USER becomes the superuser, POSTGRES_DB the default db.
POSTGRES_USER=postgres
POSTGRES_DB=postgres
POSTGRES_PASSWORD=CHANGE_ME_STRONG_DB_PASSWORD
# Backend → db connection. Host is the compose service name; no TLS because the
# traffic never leaves the internal club12 network (db publishes no host port).
# Username/Password MUST match POSTGRES_USER / POSTGRES_PASSWORD above.
# Required — the app throws at startup if missing.
ConnectionStrings__DbConnection=Host=db;Port=5432;Database=postgres;Username=postgres;Password=CHANGE_ME_STRONG_DB_PASSWORD;SSL Mode=Disable
# CORS. Unused in the proxy topology (same-origin) but the array must be non-null.
AllowedOrigins__0=https://localhost:5001
JWT__Key=CHANGE_ME_AT_LEAST_32_CHARS_LONG_SECRET
JWT__Issuer=Club12
JWT__Audience=Club12Client
Smtp__Host=smtp.example.com
Smtp__Port=587
Smtp__Username=CHANGE_ME
Smtp__Password=CHANGE_ME
Smtp__UseSsl=true # optional, defaults true
Smtp__FromEmail=no-reply@example.com
Smtp__FromName=Club12
SupaBase__ProjectUrl=https://PROJECT.supabase.co
SupaBase__ServiceRole=CHANGE_ME_SERVICE_ROLE_KEY # bad values hang startup (SupabaseHelper blocks in ctor)
SupaBase__BucketName=club12
AdminUser__Email=admin@example.com
AdminUser__Password=CHANGE_ME_STRONG_PASSWORD # first-run seeding only
Frontend__MagicLinkUrl=https://localhost:5001/magic-link
Frontend__PasswordResetUrl=https://localhost:5001/reset-password
# Database backup/restore. Keep Enabled=false until the backup-data volume is
# confirmed mounted (see DEPLOYMENT.md phased rollout) — only then flip to true.
Backup__Enabled=false
Backup__IntervalHours=24
Backup__RetentionCount=7
Backup__StorageTarget=Local
Backup__LocalStoragePath=/app/backups
Backup__PgDumpPath=pg_dump
Backup__PsqlPath=psql
+510
View File
@@ -0,0 +1,510 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# CodeGraph local index (per-machine, not shared)
.codegraph/
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
# NOTE: Backup*/ above targets old VS-upgrade backup folders, but it also
# matches the legitimate `Backup` source namespaces added by the
# scheduled-database-backups SDD change (design.md requires these exact
# folder names for the reflection-scan-collision reason documented there).
# Un-ignore them explicitly rather than weakening the upstream rule.
!Club12-Backend/Application/Backup/
!Club12-Backend/Application/Interfaces/Backup/
!Club12-Backend/Application/DTOs/Backup/
!Club12-Backend/Application/DTOs/Backup/Response/
!Club12-Backend/Infrastructure/Backup/
!Club12-Backend/API.Tests/Backup/
!Club12-Backend/API.Tests/Backup/Fakes/
# PR5 (frontend): the same `Backup*/` pattern also matches the legitimate
# `src/modules/backup/` feature module added for the admin backup/restore
# panel — un-ignore it explicitly too.
!Club12-WebClient/src/modules/backup/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
/node_modules/
./node_modules/
*.idea
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
*.ncb
*.aps
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
*.sln.iml
src/**/obj
src/**/bin
# Node modules
node_modules/
**/node_modules/
./node_modules/
# Build directories for frontend projects (React, Vue, Angular)
dist/
build/
out/
.eslintcache
# Dependency directories
bower_components/
jspm_packages/
# Temporary files
.temp/
.cache/
*.cache
# Logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# IDE and tool configs
.vscode/
.idea/
*.iml
# Testing files
coverage/
*.lcov
*.lcov.info
# Environment variable files
# `.env` (repo root) holds the real docker-compose secrets for deployment —
# never commit it. `.env.example` is intentionally NOT matched by this
# pattern (no trailing wildcard) and ships in the repo as a placeholder-only
# template; see docker-compose.yml's `env_file: .env`.
.env
.env.*.local
.env.local
.env.development.local
.env.test.local
.env.production.local
# Service Workers
sw.js
pwa-manifest.json
# Miscellaneous
.sass-cache/
.cypress_cache/
.DS_Store
Thumbs.db
.idea/
# Appsettings for each developer
appsettings.Facundo.json
appsettings.Franco.json
appsettings.Tomi.json
/Club12-Backend/API/appsettings.Franco.Development.json
/Club12-Backend/API/appsettings.Tomas.json
# Academic/internal reports (not meant to be published in the repo)
*.pdf
# Exception: static assets served by the web client MUST be versioned so they
# ship with the production build (HU-21: medical-record download 404 in prod).
!Club12-WebClient/public/documents/*.pdf
# Exception: the seeder's embedded generic ficha médica MUST be versioned so
# it ships with the server build (Infrastructure.csproj EmbeddedResource).
!Club12-Backend/Infrastructure/Persistance/Seeding/Assets/*.pdf
# Claude Code git worktrees (local scratch checkouts, never repo content)
.claude/worktrees/
# Local tooling cache
.atl/
/Club12-Backend/API/appsettings.Facundo.json
# Playwright E2E artifacts
/Club12-WebClient/test-results/
/Club12-WebClient/playwright-report/
/Club12-WebClient/blob-report/
# Playwright MCP (browser-automation tool) session snapshots/logs
/.playwright-mcp/
+167 -3
View File
@@ -1,3 +1,167 @@
# Club-12
Sistema de organizacion de torneo de basquet para la organizacion "Club 12 La Vuelta".
# Liga Club12
Sistema web de gestión integral para torneos de fútbol/básquet: equipos, jugadores, partidos, estadísticas, sanciones y usuarios, con un panel administrativo privado y una vista pública para los visitantes de la liga.
Proyecto desarrollado como Trabajo Práctico Integrador para la materia Taller de Integración.
## Qué hace el sistema
Liga Club12 reemplaza la gestión manual del torneo (antes llevada en planillas) por un sistema centralizado con dos caras:
- **Panel administrativo** (requiere login): alta, baja y modificación de jugadores, equipos, divisiones, torneos, canchas (venues), partidos y sanciones; generación automática de fixtures y llaves de eliminación; gestión de usuarios con roles; publicación de novedades (blog).
- **Vista pública** (sin login): cualquier visitante puede consultar equipos, partidos, tabla de goleadores, torneos y sanciones vigentes, sin necesidad de crear una cuenta.
### Funcionalidades principales
| Módulo | Qué permite |
|---|---|
| **Temporadas, torneos y divisiones** | Una temporada agrupa uno o más torneos; cada torneo se divide en divisiones. Generación automática de la fase de grupos y, al cerrarse, de las llaves de eliminación directa para la cantidad de equipos que clasificaron — potencia de 2 o no (bye a los mejores sembrados cuando no lo es). Un torneo puede definir más de una copa por división (ej. Copa Oro / Copa Plata), sembrada por rango de posiciones de la fase de grupos. Una zona puede dividirse en varios sub-grupos, en cuyo caso necesita al menos una copa configurada (sin ella no hay forma de determinar un campeón entre los sub-grupos). El pase a "En curso" está bloqueado si alguna zona tiene menos de 2 equipos o algún equipo no llega al mínimo de jugadores habilitados. |
| **Clubes, equipos y jugadores** | `Club` es la identidad estable de una institución a través de las temporadas; `Team` es su registro por temporada/torneo. El panel administrativo lista clubes (no equipos duplicados por temporada), con alta/baja de equipos, filtros de búsqueda, validación de DNI único por jugador, cuerpo técnico por equipo/temporada, descuentos de puntos (sanciones administrativas a la tabla), y vinculación de un club como escuadra de otro (club matriz) para agrupar squads de una misma institución. |
| **Fichas médicas / habilitación** | Carga y revisión (aprobar/rechazar) de la ficha médica de cada jugador por equipo y temporada. Solo un registro Aprobado con un archivo realmente almacenado habilita a un jugador; la habilitación no se hereda entre temporadas. |
| **Partidos** | Generación automática de partidos de fase de grupos (round-robin) y de eliminación directa, carga de resultados por planilla (el resultado final se deriva de la suma de puntos por jugador, no se tipea aparte), tabla de posiciones. Un resultado normal exige que los jugadores cargados estén habilitados y sin sanción activa, y que cada equipo tenga al menos 4 jugadores habilitados — por debajo de ese mínimo el partido se carga como walkover. |
| **Llaves (bracket)** | Visualización pública de la fase eliminatoria como un árbol de llaves — por copa, si el torneo tiene varias — con conectores entre rondas inferidos a partir del equipo ganador; si la inferencia es ambigua (partido sin jugar, datos incompletos, o un cruce ya decidido por bye), se oculta ese conector o se degrada a una vista en columnas en vez de mostrar una conexión incorrecta. |
| **Campeones** | Historial público de campeones por división/copa de los torneos ya finalizados. |
| **Estadísticas y goleadores** | Registro de estadísticas por jugador (como parte de la planilla del partido) y tabla de goleadores por torneo/equipo (top 10 en la vista pública). |
| **Impresión** | Vista imprimible de la tabla de posiciones por división (impresión nativa del navegador, sin dependencias adicionales), pensada para que los organizadores repartan o publiquen resultados en papel. |
| **Sanciones** | Registro de sanciones a jugadores con un flujo de apelación completo (pendiente → aceptada/rechazada); una sanción activa bloquea al jugador de sumar puntos en un partido. |
| **Usuarios** | Registro, login (JWT), recuperación de contraseña, activación/desactivación de cuentas, roles (RBAC). |
| **Blog** | Publicación de novedades/crónicas de partidos (con borrador previo a publicar), visibles públicamente. |
| **Sistema** | Panel de estadísticas de uso, registro de auditoría de acciones administrativas, y herramientas de administración/mantenimiento de datos. |
| **Copias de seguridad** | Respaldo automático programado de la base de datos, activo en producción; administrable manualmente desde el panel. |
## Cómo lo hace (arquitectura)
El proyecto está dividido en dos aplicaciones independientes dentro del mismo repositorio, comunicadas por una API REST.
```
Club12/
├── Club12-Backend/ .NET 8 · ASP.NET Core Web API
└── Club12-WebClient/ React 19 · TypeScript · Vite
```
### Backend — Arquitectura Limpia (Clean Architecture)
El backend está organizado en 4 capas, cada una en su propio proyecto de .NET, con las dependencias apuntando siempre hacia adentro:
```
API → Application → Domain
↑
Infrastructure
```
- **`Domain`** — entidades y enums del negocio (`Team`, `Player`, `Match`, `Tournament`, `Stage`, `PlayerSanction`, etc.). No depende de ninguna otra capa.
- **`Application`** — la lógica de negocio: servicios (`MatchService`, `StageService`, `TeamService`...), DTOs de entrada/salida, interfaces de repositorios y servicios. Solo depende de `Domain`.
- **`Infrastructure`** — implementa las interfaces que define `Application`: acceso a datos con Entity Framework Core sobre PostgreSQL, autenticación con ASP.NET Identity, integración con Supabase (almacenamiento de imágenes y backups).
- **`API`** — los controladores HTTP (delgados, sin lógica de negocio), la configuración de arranque, autenticación JWT, Swagger y el registro de dependencias.
Esto permite que la lógica de negocio (`Application`/`Domain`) no dependa de detalles técnicos como la base de datos o el framework web, y que esos detalles se puedan cambiar sin tocar las reglas del negocio.
**Stack**: .NET 8, ASP.NET Core, Entity Framework Core, PostgreSQL (Npgsql), ASP.NET Identity + JWT, AutoMapper, Serilog (logging estructurado), Swagger/Swashbuckle (documentación de la API), Supabase (storage).
### Frontend — organización por dominio
El frontend sigue una convención de módulos por dominio de negocio, en vez de organizar por tipo de archivo:
```
src/
├── modules/{dominio}/ lógica: context, hook, service, tipos
│ ├── context/ estado compartido (React Context)
│ ├── hook/ hook de acceso al context
│ ├── service/ llamadas HTTP a la API (Axios)
│ └── type/ tipos TypeScript del dominio
└── views/{dominio}/ páginas y componentes visuales de ese dominio
```
Cada uno de los ~24 dominios (equipos, jugadores, partidos, series de playoff, torneos, temporadas, divisiones, etapas, sanciones, fichas médicas, estadísticas, goleadores, canchas, clubes, campeones, cuerpo técnico, descuento de puntos, backups, administración de datos, registro de auditoría, usuarios, autenticación, blog) repite este mismo patrón, lo que hace que el código sea predecible: para entender cualquier funcionalidad alcanza con mirar su carpeta.
**Stack**: React 19, TypeScript, Vite, Material UI (MUI), TanStack Query (cacheo y sincronización de datos del servidor), React Router, Axios.
### Diagrama de flujo general
```mermaid
flowchart LR
U[Usuario / Visitante] -->|HTTPS| FE[Frontend React]
FE -->|REST + JWT| API[API .NET]
API --> APP[Application]
APP --> DOM[Domain]
API --> INFRA[Infrastructure]
INFRA --> DB[(PostgreSQL)]
INFRA --> SB[(Supabase Storage)]
```
## Cómo correrlo
Para el despliegue automático a producción (GitHub Actions → GHCR → runners self-hosted), ver
[DEPLOYMENT.md](./DEPLOYMENT.md).
### Requisitos
- .NET 8 SDK
- Node.js 18+ y npm
- Una base de datos PostgreSQL (local o en la nube)
### Backend
```bash
cd Club12-Backend
# restaurar dependencias
dotnet restore Solution/Club12.sln
# configurar la cadena de conexión, JWT, SMTP y Supabase
# (copiar API/appsettings.json a API/appsettings.Development.json y completar los valores)
# ejecutar la API (aplica las migraciones automáticamente al iniciar)
dotnet run --project API
```
La API queda disponible con Swagger UI para explorar y probar todos los endpoints documentados.
### Frontend
```bash
cd Club12-WebClient
pnpm install
pnpm run dev
```
### Tests
```bash
# backend — xUnit + WebApplicationFactory
dotnet test Club12-Backend/Solution/Club12.sln
# frontend — Vitest + Testing Library
cd Club12-WebClient && pnpm run test
```
## Estado del proyecto
- **Backend**: build sin errores ni advertencias (`dotnet build`), 955 tests automatizados en verde (al 2026-09-07; correr `dotnet test Club12-Backend/Solution/Club12.sln` para el número actual).
- **Frontend**: sin errores de lint, 825 tests automatizados en verde (al 2026-09-07; correr `npx vitest run` para el número actual).
- Reglas de negocio, cobertura funcional detallada y contexto operativo (gotchas de desarrollo): ver [Docs/ESTADO-Y-REGLAS.md](./Docs/ESTADO-Y-REGLAS.md).
## ¿Se cubren todos los requisitos?
Comparando el sistema contra los dos informes de requerimientos del proyecto (Taller Integral y Taller de Integración):
| Requisito funcional | Estado |
|---|---|
| Gestión de jugadores | ✅ Completo |
| Gestión de equipos | ✅ Completo |
| Registro de sanciones | ✅ Completo (con flujo de apelación, va más allá de lo pedido) |
| Registro de estadísticas | ✅ Completo |
| Gestión de usuarios (RBAC, recuperación de contraseña) | ✅ Completo (incluye funciones adicionales: activar/desactivar cuentas) |
| Visualización pública para visitantes | ✅ Completo |
| Creación de copias de seguridad | ✅ Implementado y activo en producción |
**Requisitos no funcionales**:
- Diseño adaptativo (responsive) — ✅ implementado en todas las vistas.
- Seguridad (roles, prevención de inyección SQL vía EF Core, JWT) — ✅ implementado.
- Testing (pruebas unitarias e integración, comprometido para el Sprint 7) — ✅ cumplido (más de 1700 tests entre ambos proyectos, ver "Estado del proyecto" arriba para el detalle por proyecto).
- Documentación técnica — ✅ Swagger para la API, este README para arquitectura y uso.
- Documentación de manual de usuario — ✅ ver [MANUAL_USUARIO.md](./MANUAL_USUARIO.md).
- Rendimiento y escalabilidad — no verificado formalmente (requeriría pruebas de carga, fuera del alcance actual).
En resumen: **los siete requisitos funcionales están cubiertos**, varios de ellos con funcionalidad adicional a la pedida originalmente (blog de novedades, generación automática de fixtures, workflow de apelación de sanciones). El único punto no verificado formalmente es el rendimiento bajo carga, que es una prueba operativa, no una funcionalidad faltante.
+78
View File
@@ -0,0 +1,78 @@
name: club12
services:
# Network-private Postgres. Same major as the Supabase project it replaces
# (17) and as the Dockerfile's postgresql-client-17. Data lives on the host's
# /home partition, not Docker's default volume dir on the small root partition.
# No `ports:` — reachable only from the club12 network. For local dev on a
# non-Linux host, override the volume source in a git-ignored
# docker-compose.override.yml.
db:
image: postgres:17-alpine
env_file: .env
command:
- "postgres"
- "-c"
- "shared_buffers=128MB"
- "-c"
- "effective_cache_size=512MB"
volumes:
- /home/docker/club12/db:/var/lib/postgresql/data
networks: [club12]
expose: ["5432"]
restart: unless-stopped
deploy:
resources:
limits:
memory: 512m
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
backend:
build: { context: ./Club12-Backend }
image: ghcr.io/francoru/club12-backend:latest
env_file: .env
environment:
ASPNETCORE_ENVIRONMENT: Production
expose: ["8080"]
networks: [club12]
volumes:
- backup-data:/app/backups
depends_on:
db:
condition: service_healthy
restart: unless-stopped
deploy:
resources:
limits:
memory: 1g
healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost:8080/health/ready"]
interval: 30s
timeout: 5s
retries: 5
start_period: 90s
frontend:
build:
context: ./Club12-WebClient
image: ghcr.io/francoru/club12-frontend:latest
depends_on:
backend: { condition: service_healthy }
ports: ["${FRONTEND_PORT:-5001}:80"]
networks: [club12]
restart: unless-stopped
deploy:
resources:
limits:
memory: 128m
networks:
club12: { driver: bridge }
volumes:
backup-data: {}