diff --git a/docs/web/diagrams/deployment.md b/docs/web/diagrams/deployment.md index c4f678ff..0d425d4b 100644 --- a/docs/web/diagrams/deployment.md +++ b/docs/web/diagrams/deployment.md @@ -6,10 +6,10 @@ ## Notes -- **Dev network** (`biergarten-dev`, bridge): internal DNS resolves `sql-server` and `api`. Volumes: `biergarten-dev-data`. Startup order: SQL Server (health check) → migrations (run-once) → seed (run-once) → API (long-running). -- **Test network** (`biergarten-test`, bridge): all test components isolated; fresh DB instance each run (`CLEAR_DATABASE=true`, ephemeral `biergarten-test-data` volume). All tests run in parallel, results aggregated. +- **Dev network** (`devnet`, bridge): internal DNS resolves service names such as `sqlserver` and `api.core`. Volumes: `sqlserverdata-dev`, `nuget-cache-dev`, `seaweedfsdata-dev`. Startup order: SQL Server (health check) → migrations (run-once) → seed (run-once, depends on `seaweedfs`) → API (long-running, depends on seed). +- **Test network** (`testnet`, bridge): all test components isolated; fresh DB instance each run (`CLEAR_DATABASE=true`, ephemeral `sqlserverdata-test`/`seaweedfsdata-test` volumes). `api.specs`, `unit.tests`, and `frontend.tests` all run as separate containers, results aggregated. - **Prod network** (`prodnet`, bridge): isolated from dev/test networks. Volumes: `sqlserverdata-prod`, `nuget-cache-prod`. No seed step in production. -- **Database-only environment**: same devnet volumes/images as `docker-compose.dev.yaml`, minus `api.core` and `mailpit` — for working against the database without running the API. -- **Minimal environment**: database + mailpit only, no API container — for frontend development against an `API.Core` process run outside Docker. -- `unit.tests` builds `Dockerfile.tests`, which restores/builds against `Core.slnx` then runs `dotnet test` for every `Features/*.Tests` project in turn (`Features.Users.Tests`, `Features.Breweries.Tests`, `Features.Emails.Tests`), mocking each handler's repository/service dependencies with Moq — no real database needed. +- **Database-only environment**: same devnet volumes/images as `docker-compose.dev.yaml`, minus `api.core`, `frontend`, and `mailpit` — for working against the database (and object storage, since `seaweedfs` is still included) without running the API or website. +- **Minimal environment**: database + migrations + seed + `seaweedfs` + mailpit, no API or frontend container — for frontend development against an `API.Core` process run outside Docker. +- `unit.tests` builds `Dockerfile.tests`, which restores/builds against `Biergarten.API.slnx` then runs `dotnet test` for every `Features/*.Tests` project in turn (`Features.Users.Tests`, `Features.Breweries.Tests`, `Features.Emails.Tests`, `Features.PhotoUpload.Tests`), mocking each handler's repository/service dependencies with Moq — no real database needed. - `.trx` results are readable by Visual Studio, Azure DevOps, and GitHub Actions. diff --git a/docs/web/diagrams/deployment.mmd b/docs/web/diagrams/deployment.mmd index 09f7b70d..c4f78809 100644 --- a/docs/web/diagrams/deployment.mmd +++ b/docs/web/diagrams/deployment.mmd @@ -5,7 +5,7 @@ flowchart TB Host -->|http://localhost:8080| DevAPI subgraph DEV["Development Environment (docker-compose.dev.yaml)"] - DevDB[("SQL Server 2022
Biergarten Database
:1433")] + DevDB[("SQL Server 2022
Biergarten Database
:1434")] DevAPI["API Container
ASP.NET Core 10
:8080 HTTP / :8081 HTTPS"] DevMig["Migrations (run-once)
Database.Migrations"] DevSeed["Seed (run-once)
Database.Seed"] @@ -21,11 +21,13 @@ flowchart TB DevAPI -.->|depends_on| DevSeed subgraph TEST["Test Environment (docker-compose.test.yaml)"] - TestDB[("SQL Server, isolated instance
Biergarten Test Database
:1434")] + TestDB[("SQL Server, isolated instance
Biergarten Test Database
no host port published")] TestMig["Migrations (test)"] TestSeed["Seed (test)
minimal: test.user only"] + TestSeaweedFS["seaweedfs
S3-compatible object storage"] Specs["API.Specs
Reqnroll + xUnit
(integration tests)"] UnitTests["unit.tests
xUnit + Moq
Features.*.Tests, one container"] + FrontendTests["frontend.tests
Playwright/Vitest"] end TestMig -->|1. Migrate| TestDB @@ -34,12 +36,14 @@ flowchart TB UnitTests -.->|depends_on for startup ordering only, no real connection| TestDB TestMig -.->|depends_on| TestDB TestSeed -.->|depends_on| TestMig + TestSeed -.->|depends_on| TestSeaweedFS Specs -.->|depends_on| TestSeed UnitTests -.->|depends_on| TestSeed - Results[["test-results/ (mounted volume)
api-specs/results.trx
Features.Users.Tests.trx
Features.Breweries.Tests.trx
Features.Emails.Tests.trx"]] + Results[["test-results/ (mounted volume)
api-specs/results.trx
Features.Users.Tests.trx
Features.Breweries.Tests.trx
Features.Emails.Tests.trx
Features.PhotoUpload.Tests.trx"]] Specs -->|Export TRX| Results UnitTests -->|Export TRX, one per slice| Results + FrontendTests -->|Export results| Results subgraph PROD["Production Environment (docker-compose.prod.yaml)"] ProdDB[("SQL Server 2022
Biergarten Database
no host port published")] @@ -56,21 +60,25 @@ flowchart TB DbOnlyDB[("SQL Server
:1434")] DbOnlyMig["Migrations (run-once)"] DbOnlySeed["Seed (run-once)"] + DbOnlySeaweedFS["seaweedfs
S3-compatible object storage"] end DbOnlyMig -->|1. Run migrations| DbOnlyDB DbOnlySeed -->|2. Seed data| DbOnlyDB DbOnlyMig -.->|depends_on| DbOnlyDB DbOnlySeed -.->|depends_on| DbOnlyMig + DbOnlySeed -.->|depends_on| DbOnlySeaweedFS subgraph MIN["Minimal Environment (docker-compose.min.yaml)"] MinDB[("SQL Server
:1433")] MinMig["Migrations (run-once)"] MinMailpit["Mailpit
:8025 / :1025"] MinSeed["Seed (run-once)"] + MinSeaweedFS["seaweedfs
S3-compatible object storage"] end MinMig -->|1. Run migrations| MinDB MinSeed -->|2. Seed data| MinDB MinMig -.->|depends_on| MinDB MinSeed -.->|depends_on| MinMig + MinSeed -.->|depends_on| MinSeaweedFS