# brianaarlette/campussoporte-mini-data-center architecture

> Architecture diagram of the GitHub repository brianaarlette/campussoporte-mini-data-center, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-10). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/brianaarlette/campussoporte-mini-data-center
- Repository: https://github.com/brianaarlette/campussoporte-mini-data-center

## Overview

CampusSoporte is a local Docker-based campus-incident demo. A user reaches the portal through the Nginx load balancer; the browser UI lists, creates, edits, and deletes incidents through the API, which persists them in MariaDB. The UI also checks which web replica responded, records visits, and runs request simulations whose results are saved for monitoring. Grafana, Alloy, Loki, and Portainer provide documented observability and administration capabilities. Several infrastructure links are based on the README rather than sampled configuration or source.

Main entry points: [`api/app.py`](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/api/app.py) (Incident API), [`sitios/comun/app.js`](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/sitios/comun/app.js) (Portal UI), [`nginx/lb.conf`](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/nginx/lb.conf) (Nginx load balancer), [`grafana/dashboards/minidc.json`](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/grafana/dashboards/minidc.json) (Dashboards)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry_ui["Portal and entry"]
  node_lb["Nginx load balancer<br/>[lb.conf]"]
  node_web1["Web replica 1<br/>[index.html]"]
  node_web2["Web replica 2<br/>[index.html]"]
  node_web3["Web replica 3<br/>[index.html]"]
  node_ui["Portal UI<br/>[app.js]"]
end

subgraph group_incident_api["Incident services"]
  node_api["Incident API<br/>[app.py]"]
  node_incidents["Incident CRUD<br/>[app.py]"]
  node_visits["Visit tracking<br/>[app.py]"]
  node_load_tests["Request simulations<br/>[app.js]"]
  node_test_records["Test records<br/>[app.py]"]
end

subgraph group_data["Persistent data"]
  node_db[("MariaDB<br/>[01_esquema.sql]")]
end

subgraph group_observability["Monitoring and administration"]
  node_alloy["Docker log collection<br/>[config.alloy]"]
  node_loki[("Log storage<br/>[loki.yaml]")]
  node_grafana["Dashboards<br/>[minidc.json]"]
  node_grafana_provisioning["Grafana provisioning<br/>[fuentes.yaml]"]
  node_portainer["Container administration<br/>[docker-compose.yml]"]
end

node_user(("Campus user"))

node_user -->|"opens portal"| node_lb
node_lb -->|"balances requests"| node_web1
node_lb -->|"balances requests"| node_web2
node_lb -->|"balances requests"| node_web3
node_web1 -->|"serves portal"| node_ui
node_web2 -->|"serves portal"| node_ui
node_web3 -->|"serves portal"| node_ui
node_ui -->|"calls endpoints"| node_api
node_api -->|"routes CRUD"| node_incidents
node_api -->|"records visits"| node_visits
node_ui -->|"runs simulation"| node_load_tests
node_load_tests -->|"submits results"| node_api
node_api -->|"stores results"| node_test_records
node_incidents -->|"reads and writes"| node_db
node_visits -->|"reads and writes"| node_db
node_test_records -->|"reads and writes"| node_db
node_alloy -->|"ships Docker logs"| node_loki
node_grafana -->|"queries logs"| node_loki
node_grafana_provisioning -->|"configures dashboards"| node_grafana
node_grafana -.->|"shows incident data"| node_api
node_portainer -->|"offers administration"| node_user

click node_lb "https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/nginx/lb.conf"
click node_web1 "https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/sitios/web1/index.html"
click node_web2 "https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/sitios/web2/index.html"
click node_web3 "https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/sitios/web3/index.html"
click node_ui "https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/sitios/comun/app.js"
click node_api "https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/api/app.py"
click node_incidents "https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/api/app.py"
click node_visits "https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/api/app.py"
click node_load_tests "https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/sitios/comun/app.js"
click node_test_records "https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/api/app.py"
click node_db "https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/mariadb/init/01_esquema.sql"
click node_alloy "https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/observabilidad/config.alloy"
click node_loki "https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/observabilidad/loki.yaml"
click node_grafana "https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/grafana/dashboards/minidc.json"
click node_grafana_provisioning "https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/grafana/provisioning/datasources/fuentes.yaml"
click node_portainer "https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/docker-compose.yml"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_lb,node_web1,node_web2,node_web3,node_ui,node_user toneBlue
class node_api,node_incidents,node_visits,node_load_tests,node_test_records toneAmber
class node_db toneMint
class node_alloy,node_loki,node_grafana,node_grafana_provisioning,node_portainer toneRose
```

## Components

### Portal and entry

- [Nginx load balancer](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/nginx/lb.conf): `nginx/lb.conf`
- [Web replica 1](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/sitios/web1/index.html): `sitios/web1/index.html`
- [Web replica 2](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/sitios/web2/index.html): `sitios/web2/index.html`
- [Web replica 3](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/sitios/web3/index.html): `sitios/web3/index.html`
- [Portal UI](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/sitios/comun/app.js): `sitios/comun/app.js`

### Incident services

- [Incident API](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/api/app.py): `api/app.py`
- [Incident CRUD](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/api/app.py): `api/app.py`
- [Visit tracking](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/api/app.py): `api/app.py`
- [Request simulations](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/sitios/comun/app.js): `sitios/comun/app.js`
- [Test records](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/api/app.py): `api/app.py`

### Persistent data

- [MariaDB](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/mariadb/init/01_esquema.sql): `mariadb/init/01_esquema.sql`

### Monitoring and administration

- [Docker log collection](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/observabilidad/config.alloy): `observabilidad/config.alloy`
- [Log storage](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/observabilidad/loki.yaml): `observabilidad/loki.yaml`
- [Dashboards](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/grafana/dashboards/minidc.json): `grafana/dashboards/minidc.json`
- [Grafana provisioning](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/grafana/provisioning/datasources/fuentes.yaml): `grafana/provisioning/datasources/fuentes.yaml`
- [Container administration](https://github.com/brianaarlette/campussoporte-mini-data-center/blob/main/docker-compose.yml): `docker-compose.yml`

### Other components

- **Campus user**

## Connections

- Campus user → Nginx load balancer: opens portal (evidence: `README.md`)
- Nginx load balancer → Web replica 1: balances requests (evidence: `README.md`)
- Nginx load balancer → Web replica 2: balances requests (evidence: `README.md`)
- Nginx load balancer → Web replica 3: balances requests (evidence: `README.md`)
- Web replica 1 → Portal UI: serves portal (evidence: `README.md`)
- Web replica 2 → Portal UI: serves portal (evidence: `README.md`)
- Web replica 3 → Portal UI: serves portal (evidence: `README.md`)
- Portal UI → Incident API: calls endpoints (evidence: `sitios/comun/app.js`)
- Incident API → Incident CRUD: routes CRUD (evidence: `api/app.py`)
- Incident API → Visit tracking: records visits (evidence: `api/app.py`)
- Portal UI → Request simulations: runs simulation (evidence: `sitios/comun/app.js`)
- Request simulations → Incident API: submits results (evidence: `sitios/comun/app.js`)
- Incident API → Test records: stores results (evidence: `api/app.py`)
- Incident CRUD → MariaDB: reads and writes (evidence: `api/app.py`)
- Visit tracking → MariaDB: reads and writes (evidence: `api/app.py`)
- Test records → MariaDB: reads and writes (evidence: `api/app.py`)
- Docker log collection → Log storage: ships Docker logs (evidence: `README.md`)
- Dashboards → Log storage: queries logs (evidence: `README.md`)
- Grafana provisioning → Dashboards: configures dashboards (evidence: `README.md`)
- Dashboards → Incident API: shows incident data
- Container administration → Campus user: offers administration (evidence: `README.md`)
