MartinZ18/Proyecto-Inventario-EGI
GitHub: MartinZ18/Proyecto-Inventario-EGI
面向理工大学实验室的设备库存管理系统,整合 FastAPI 后端、双数据库、AD 认证与 Kubernetes 零信任网络部署的完整全栈项目。
Stars: 0 | Forks: 0
# EGI 综合项目 — ITU 库存系统
面向理工大学 (ITU) 的实验室设备库存系统。包含口头答辩的小组综合项目。
## 团队与职责
| 成员 | 层 |
|---|---|
| Backend | FastAPI + Python — API REST |
| Frontend | HTML/JS/Bootstrap — Web 界面 |
| 数据库 | SQL Server 2022 + MongoDB 7 — 模型与脚本 |
| 安全与网络 | Kubernetes, NetworkPolicies, Active Directory, pfSense, CI/CD |
## 技术栈
| 层 | 技术 |
|---|---|
| API | Python 3.12 + FastAPI + SQLAlchemy |
| Frontend | HTML + CSS + 原生 JS + Bootstrap 5 |
| 关系型数据库 | SQL Server 2022 (`inventario_ubicaciones`) |
| 文档型数据库 | MongoDB 7 (`inventario_componentes.computadoras`) |
| 身份验证 | LDAP → Active Directory (`itu.local`) + JWT (HS256) |
| 编排 | Minikube + Calico CNI (NetworkPolicies) |
| CI/CD | GitHub Actions — LinuxEGI 上的 self-hosted runner |
| 网关 | pfSense — NAT, DHCP relay, AD 身份验证 |
## 仓库结构
```
.
├── backend/ FastAPI — código de la API
│ ├── app/ Aplicación (routers, services, repos, models, schemas)
│ ├── scripts-dev/ Seeds SQL/Mongo/LDAP para desarrollo local
│ ├── Dockerfile
│ ├── docker-compose.yml SQL Server + MongoDB + OpenLDAP (dev local)
│ ├── requirements.txt
│ └── .env.example
│
├── frontend/ Interfaz web — HTML/JS vanilla + Bootstrap 5
│ ├── index.html Login
│ ├── listado.html Tabla de equipos
│ ├── detalle.html Detalle completo de un equipo
│ ├── formulario.html Alta / edición (solo Técnicos)
│ ├── js/ api.js, login.js, listado.js, detalle.js, formulario.js
│ └── css/ img/
│
├── bases-de-datos/ Scripts de base de datos
│ └── database/scripts/
│ ├── Script SQL Server 2022.sql Crea ubicacion_db con 5 tablas + seed
│ └── inventario-db_mongo.js Crea inventario_db.componentes + seed
│
├── kubernetes/ Manifiestos del namespace "inventario"
│ ├── 00-namespace.yaml
│ ├── configmaps/
│ ├── deployments/ backend, frontend, mongo
│ ├── services/
│ ├── external/ Endpoints hacia SQL Server y AD (VMs, no pods)
│ └── network-policies/ 7 políticas zero-trust (00-06)
│
├── active-directory/ Scripts PowerShell — OUs, grupos, usuarios AD
├── pfsense/ Runbook + scripts PHP para configurar pfSense
├── sql-server-iis/ Runbook + scripts de firewall para SQL Server
├── iptables/ Reglas de firewall del host LinuxEGI (Minikube)
├── docker/frontend/ Dockerfile + nginx.conf para el frontend en K8s
│
├── infra/ Configuración de red dinámica
│ ├── red.example.env Plantilla (committear) — copiar a red.local.env
│ └── scripts/ detectar-red.*, generar-manifiestos.*, seed-mongo.sh
│
├── docs/ Documentación técnica
│ ├── arquitectura.md Diagrama de componentes, flujo de autenticación
│ ├── topologia-red.md Diagrama de red, 7 NetworkPolicies, matriz de puertos
│ └── runbook-despliegue.md Orden end-to-end de despliegue (Fases 0-5)
│
└── .github/workflows/
└── deploy.yml Pipeline CI/CD — build + deploy en Minikube
```
## 本地启动(开发)
```
# 启动 SQL Server、MongoDB 和 OpenLDAP(使用 Docker)
cd backend
docker compose up -d
# Python 环境
python -m venv venv
venv\Scripts\activate # Windows
pip install -r requirements.txt
# 配置环境变量
cp .env.example .env
# 编辑 .env:SQLSERVER_DB=inventario_ubicaciones
# 初始 Seed
# SQL Server:执行 bases-de-datos/database/scripts/Script SQL Server 2022.sql
# 或 scripts-dev/ubicaciones_prueba.sql 用于快速开发
# MongoDB:mongosh < scripts-dev/componentes_prueba.js
# 启动 API
uvicorn app.main:app --reload --port 8000
# Swagger UI:http://localhost:8000/docs
# 前端
# 直接在浏览器中打开 frontend/index.html
```
## 在 Kubernetes 中部署
查看 [`docs/runbook-despliegue.md`](docs/runbook-despliegue.md) 以获取完整的流程
(阶段 0-5)。摘要:
```
# 复制网络模板并填入实验室的 IP
cp infra/red.example.env infra/red.local.env
# 使用解析后的 IP 生成 manifest
bash infra/scripts/detectar-red.sh
bash infra/scripts/generar-manifiestos.sh
# 应用到集群(或使用来自 GitHub Actions 的 CI/CD pipeline)
kubectl apply -f kubernetes/00-namespace.yaml
kubectl apply -f kubernetes/configmaps/
kubectl apply -f kubernetes/_generated/external/
kubectl apply -f kubernetes/deployments/
kubectl apply -f kubernetes/services/
kubectl apply -f kubernetes/_generated/network-policies/
```
`deploy.yml` 流水线将所有这一切自动化。需要安装在 LinuxEGI 上且带有
`minikube` 标签的 self-hosted runner,并配置好 GitHub Secrets
(`JWT_SECRET`, `SQLSERVER_USER`, `SQLSERVER_PASSWORD`, `MONGO_ROOT_USER`,
`MONGO_ROOT_PASSWORD`, `LDAP_BIND_PASSWORD`)。
## API 端点
| 方法 | 路径 | 访问权限 |
|---|---|---|
| POST | `/auth/login` | 公开 |
| GET | `/inventario/` | 需身份验证 |
| GET | `/inventario/{id}` | 需身份验证 |
| GET | `/inventario/ubicaciones` | 需身份验证 |
| POST | `/inventario/equipos` | 仅限技术人员 |
| PUT | `/inventario/equipos/{id}` | 仅限技术人员 |
| DELETE | `/inventario/equipos/{id}` | 仅限技术人员 |
| POST | `/inventario/componentes` | 仅限技术人员 |
| PUT | `/inventario/componentes/{id}` | 仅限技术人员 |
| DELETE | `/inventario/componentes/{id}` | 仅限技术人员 |
| GET | `/health` | 公开(K8s health check) |
## 安全 — 零信任 NetworkPolicies
在 `inventario` namespace 中应用的 7 项策略:
| 文件 | 效果 |
|---|---|
| `00-default-deny.yaml` | 默认拒绝所有流量 |
| `01-allow-dns.yaml` | 允许 egress DNS → kube-dns |
| `02-allow-frontend-ingress.yaml` | 允许 ingress :80 到 frontend |
| `03-allow-frontend-egress.yaml` | 允许 frontend 的 egress → API :8000 |
| `04-allow-backend-from-frontend.yaml` | 允许仅来自 frontend 的 ingress :8000 到 backend |
| `05-allow-backend-egress.yaml` | 允许 backend 的 egress → MongoDB (pod) + SQL Server/AD (ipBlock) |
| `06-allow-mongodb-from-backend.yaml` | 允许仅来自 backend 的 ingress :27017 到 MongoDB |
## 测试用户(Active Directory)
| 用户 | 密码 | 角色 |
|---|---|---|
| `mgomez` | `Inventario!2025` | 技术人员(完整 CRUD) |
| `clopez` | `Inventario!2025` | 技术人员(完整 CRUD) |
| `jperez` | `Inventario!2025` | 教师(只读) |
| `agarcia` | `Inventario!2025` | 教师(只读) |
| `psanchez` | `Inventario!2025` | 学生(只读) |
## 团队成员
- Luciana Torres - tluciana893@gmail.com |
- Brian Tomadin - tomadinbrian@gmail.com |
- Franco Prolongo - franklinelcrack3@gmail.com |
- Roberto Vildoza - Roberto.e.vildoza.25@gmail.com |
- Agustina Zartmann - zartmann.agustina@gmail.com |
- Martin Zamora - martin.zamora004@gmail.com |
标签:Active Directory, AV绕过, Checkov, FastAPI, Plaso, Terraform 安全, 前端Bootstrap, 多数据库架构, 子域名突变, 网络测绘, 自定义脚本, 请求拦截, 资产管理系统, 逆向工具