Porras-Dev/EduFlix-Agora
GitHub: Porras-Dev/EduFlix-Agora
一个基于Proxmox和Jellyfin的自托管教育流媒体平台,配备完整的网络基础设施、多层安全防护和监控告警体系,专为学校内网部署设计。
Stars: 0 | Forks: 0
# EduFlix Ágora — 自托管教育流媒体平台
这是一个完全自托管的流媒体教育平台,专为 **IES Ágora(西班牙卡塞雷斯)** 设计和部署,作为 2025/2026 学年网络系统管理高等学位(ASIR)的毕业设计项目。
该平台允许学生和教师从任何设备访问教育视频内容——提供与现代流媒体服务相同的体验,但完全运行在学校的基础设施上,没有第三方依赖,零许可成本,并拥有完全的数据主权。
## 目录
1. [架构](#1-architecture)
2. [技术栈](#2-tech-stack)
3. [网络安全](#3-cybersecurity)
4. [仓库内容](#4-repository-contents)
5. [部署说明](#5-deployment)
6. [未包含的内容](#6-whats-not-included)
7. [可持续性分析](#7-sustainability-analysis)
8. [未来改进](#8-future-improvements)
9. [作者](#9-author)
## 1. 架构
该平台运行在一台利旧的台式机(Intel i5-10400,16 GB RAM)上,使用 **Proxmox VE** 作为 hypervisor,并在 Ubuntu Server 24.04 上运行三个 LXC container。
```
┌─────────────────────────────────────────────────────────────────────┐
│ PROXMOX VE HOST │
│ LAN 192.168.1.20 · ZeroTier 10.204.191.210 │
│ Intel i5-10400 · 16 GB RAM │
└──────────────────────────┬──────────────────────────────────────────┘
│ LXC containers (Ubuntu Server 24.04)
┌──────────────┼──────────────┐
│ │ │
▼ ▼ ▼
┌────────────────┐ ┌──────────────┐ ┌──────────────────────┐
│ LXC 100 │ │ LXC 101 │ │ LXC 102 │
│ servidor- │ │ cibersegu- │ │ servicios-red │
│ principal │ │ ridad │ │ │
│ │ │ │ │ │
│ LAN 192.168. │ │ LAN 192.168. │ │ LAN 192.168.1.22 │
│ 1.21 │ │ 1.23 │ │ ZeroTier │
│ ZeroTier │ │ ZeroTier │ │ 10.204.191.148 │
│ 10.204.191.231 │ │ 10.204.191. │ │ │
│ │ │ 184 │ │ · BIND9 (DNS) │
│ · Jellyfin │ │ │ │ · Chrony (NTP) │
│ · PostgreSQL │ │ · Wazuh SIEM │ │ · vsftpd (FTP/TLS) │
│ · NGINX │ │ · Suricata │ │ · Postfix (SMTP) │
│ · pgAdmin │ │ IDS │ │ · Prometheus │
│ · PHP Portal │ │ │ │ · Grafana │
│ · Fail2Ban │ │ │ │ │
│ · CrowdSec │ │ │ │ │
└────────────────┘ └──────────────┘ └──────────────────────┘
│ │ │
└──────────ZeroTier VPN───────┘
Network ID: 3b19b3a7161ea5af
Private virtual overlay across all nodes
```
### 数据流
```
Student / Teacher
│
▼
ZeroTier VPN ──or── LAN (192.168.1.x)
│
▼
NGINX (reverse proxy + HTTPS + security headers)
│
├──► Jellyfin ──────────────► media files (LXC 100)
│
└──► PHP Portal ──► PostgreSQL (auth + metrics + logs)
│
└──► Node.js WebSocket (real-time log streaming)
Prometheus (LXC 102) ──scrapes──► all 3 nodes
│
▼
Grafana dashboards + 5 alert rules
Wazuh agents (all nodes) ──► Wazuh Manager (LXC 101)
Suricata ──────────────────► IDS alerts (LXC 101)
Fail2Ban ──────────────────► IP ban + Telegram alert (LXC 100)
```
## 2. 技术栈
### 虚拟化与容器
| 技术 | 版本 | 作用 |
|---|---|---|
| Proxmox VE | 9.1 | Hypervisor — 管理全部 3 个 LXC container |
| LXC | — | 基于 Ubuntu 24.04 的轻量级 OS container |
| Docker + Docker Compose | — | LXC 100 上的服务编排 |
### 媒体与数据库
| 技术 | 作用 |
|---|---|
| Jellyfin | 自托管媒体服务器,带有自定义的 IES Ágora CSS 主题和徽标 |
| PostgreSQL 16 | 关系型数据库,用于跟踪用户、内容和访问日志 |
| pgAdmin | PostgreSQL Web 管理界面 |
| Python 同步脚本 | 实现 Jellyfin API 与 PostgreSQL 之间的实时同步 |
| Whisper AI | 为教育视频自动生成字幕 |
### Web 与代理
| 技术 | 作用 |
|---|---|
| NGINX | 反向代理、HTTPS 终止、安全标头 |
| HAProxy | 负载均衡器 |
| PHP 门户 | 自定义管理门户 — 身份验证、指标监控、WebSocket 集成 |
| Node.js WebSocket | 向 PHP 门户进行实时日志流传输 |
### 网络安全
| 技术 | 作用 |
|---|---|
| Wazuh SIEM | 集中式安全事件监控 — 在所有 3 个节点上部署了代理 |
| Suricata IDS | 实时网络流量检查和入侵检测 |
| Fail2Ban | 检测到暴力破解时自动封禁 IP + Telegram 告警 |
| CrowdSec | 协作式威胁情报 — 第二道安全防线 |
| UFW | 所有节点上的主机防火墙 |
### 监控与备份
| 技术 | 作用 |
|---|---|
| Prometheus | 收集所有节点的指标 |
| Grafana | 仪表盘 + 5 条已配置的告警规则 |
| Restic | 加密的、增量的自动备份,带有保留策略 |
### 网络服务 (LXC 102)
| 技术 | 作用 |
|---|---|
| BIND9 | 内部 DNS 服务器 — `agora.local` 区域 |
| Chrony | 跨所有节点的 NTP 时间同步 |
| vsftpd | 带有 TLS 的 FTP 服务器,用于教师上传内容 |
| Postfix | 内部 SMTP 邮件服务器 |
### 远程访问与客户端
| 技术 | 作用 |
|---|---|
| ZeroTier | 跨所有节点的私有虚拟覆盖网络 |
| Java 桌面客户端 | Jellyfin 监控客户端 — 局域网和 ZeroTier 版本 |
## 3. 网络安全
该平台实现了一个 **5 层安全模型**,其中每一层都会捕捉到上一层遗漏的内容:
```
Incoming traffic
│
▼
┌─────────────┐
│ UFW │ Layer 1 — host firewall: blocks all ports except
│ Firewall │ explicitly allowed ones on every node
└──────┬──────┘
│
▼
┌─────────────┐
│ Fail2Ban │ Layer 2 — brute force detection: monitors SSH,
│ │ NGINX and Jellyfin logs; bans offending IPs
│ │ automatically and sends instant Telegram alerts
└──────┬──────┘
│
▼
┌─────────────┐
│ CrowdSec │ Layer 3 — collaborative threat intelligence:
│ │ blocks IPs flagged by the global CrowdSec
│ │ community before they even connect
└──────┬──────┘
│
▼
┌─────────────┐
│ Wazuh SIEM │ Layer 4 — centralised event correlation:
│ │ agents on all 3 nodes; generates Level 10
│ │ alerts on brute-force; monitors file integrity,
│ │ system calls and log anomalies in real time
└──────┬──────┘
│
▼
┌─────────────┐
│ Suricata │ Layer 5 — deep packet inspection: analyses
│ IDS │ every network packet in real time; detects
│ │ intrusion patterns, port scans and exploits
└─────────────┘
```
### 额外安全加固
- 所有节点上的 SSH 均使用自定义端口、仅密钥身份验证以及 `AllowUsers` 白名单
- NGINX 配置了严格的安全标头(HSTS、X-Frame-Options、CSP)
- Restic 备份在静态下进行加密,并配有自动调度和保留策略
- 每周自动运行安全审计脚本 (`server-config/auditoria.sh`)
- 在项目展示期间测试了实时暴力破解演示:可实时触发 Wazuh Level 10 告警 + Fail2Ban 封禁 + Telegram 通知
## 4. 仓库内容
| 路径 | 描述 |
|---|---|
| `EduFlix-Jellyfin-Client.jar` | Java 桌面客户端 — 局域网版本 |
| `EduFlix-Jellyfin-Client-ZeroTier.jar` | Java 桌面客户端 — ZeroTier 远程版本 |
| `EduFlix-Agora-Network-Diagram.pkt` | Cisco Packet Tracer 网络拓扑图 |
| `EduFlix-Agora-Network-Diagram.pkz` | Cisco Packet Tracer 网络拓扑图(已打包) |
| `EduFlix-Agora-Project-Documentation.pdf` | 完整的项目文档(137 页) |
| `EduFlix-Agora-Technical-Annex.pdf` | 包含分步安装说明的技术附件(257 页) |
| `portal/` | PHP 管理门户源代码 |
| `portal/index.php` | 门户主入口 |
| `portal/login.php` | 身份验证系统 |
| `portal/metricas.php` | 指标与使用情况仪表盘 |
| `portal/logs.php` | 实时日志查看器 (WebSocket) |
| `portal/jellyfin.php` | Jellyfin 集成与内容管理 |
| `portal/basedatos.php` | 数据库管理界面 |
| `portal/backups.php` | 备份状态与管理 |
| `portal/servicios.php` | 服务状态概览 |
| `portal/includes/` | 共享的 PHP 组件(身份验证、布局、功能函数) |
| `server-config/docker-compose.yml` | Docker Compose — Jellyfin, PostgreSQL, NGINX, pgAdmin |
| `server-config/auditoria.sh` | 每周自动安全审计脚本 |
| `server-config/backup.sh` | Restic 备份自动化脚本 |
| `server-config/telegram_alert.sh` | Fail2Ban → Telegram 通知脚本 |
| `server-config/sync_jellyfin.py` | Jellyfin API 到 PostgreSQL 的实时同步脚本 |
| `server-config/update_fail2ban_nginx.sh` | Fail2Ban 日志路径更新脚本(重启时运行) |
| `server-config/websocket/server.js` | 用于实时日志流传输的 Node.js WebSocket 服务端 |
| `.env.example` | 环境变量模板 |
## 5. 部署说明
### 硬件要求
| 组件 | 最低配置 | 本项目实际使用配置 |
|---|---|---|
| CPU | 4 核 | Intel i5-10400 (6c/12t) |
| RAM | 8 GB | 16 GB DDR4 |
| 存储 | 256 GB SSD + HDD | 256 GB NVMe + 1 TB HDD |
| 网络 | 1 Gbps | 集成网络 |
### 部署顺序
**1. Proxmox VE**
- 在宿主机上安装 Proxmox VE 9.1
- 创建 3 个装有 Ubuntu Server 24.04 的 LXC container
**2. LXC 102 — 网络服务(首先部署)**
```
# 安装:BIND9, Chrony, vsftpd, Postfix, Prometheus, Grafana
# 配置 agora.local DNS zone
# 将 Chrony 设置为所有节点的 NTP source
```
**3. LXC 100 — 主服务器**
```
# 安装 Docker + Docker Compose
# 将 server-config/docker-compose.yml 复制到服务器
cp .env.example .env
# 使用真实值填写 .env
docker compose up -d
# 安装并配置:Fail2Ban, CrowdSec, NGINX, SSH hardening
```
**4. LXC 101 — 网络安全**
```
# 部署 Wazuh Manager
# 在所有 3 个节点上安装 Wazuh agents
# 部署 Suricata IDS
```
**5. ZeroTier**
- 在 [my.zerotier.com](https://my.zerotier.com) 创建一个 ZeroTier 网络
- 将所有 3 个节点和 Proxmox 宿主机加入该网络
- 在 ZeroTier 中分配静态 IP
### 环境变量
将 `.env.example` 复制为 `.env` 并填入所需的值:
| 变量 | 描述 |
|---|---|
| `JELLYFIN_API_KEY` | Jellyfin API 密钥(仪表盘 → API Keys) |
| `POSTGRES_PASSWORD` | PostgreSQL 管理员密码 |
| `TELEGRAM_BOT_TOKEN` | 用于 Fail2Ban 告警的 Telegram 机器人 token |
| `TELEGRAM_CHAT_ID` | 用于接收告警的 Telegram 聊天 ID |
| `ZEROTIER_NETWORK_ID` | ZeroTier 网络 ID |
## 6. 未包含的内容
该仓库仅包含源代码、脚本和文档。出于安全或隐私原因,以下内容被排除:
| 排除项 | 原因 |
|---|---|
| `.env` | 包含密码、API 密钥和 token |
| SSL/TLS 证书 | 特定于站点 — 必须为每次部署单独生成 |
| Jellyfin 媒体库 | 受版权保护的教育内容 |
| PostgreSQL 数据库转储 | 包含真实的师生数据(受 GDPR 保护) |
| Wazuh 代理密钥 | 特定于节点的安全凭证 |
| SSH 私钥 | 私有身份验证材料 |
| ZeroTier 身份验证 token | 特定于网络的密钥 |
使用此仓库进行部署时,必须重新创建所有凭证。有关完整的设置过程,请参阅 `EduFlix-Agora-Technical-Annex.pdf`。
## 7. 可持续性分析
整个基础设施运行在一台 **利旧的 5 年期台式机** 上,延长了其使用寿命并避免了电子垃圾。所有软件均为 100% 免费和开源的 — 零许可成本。
| | EduFlix Ágora(本地) | 同等的云端方案 (AWS) |
|---|---|---|
| 硬件成本 | 0 €(利旧设备) | 包含在月度成本中 |
| 软件许可证 | 0 €(100% 开源) | 包含在月度成本中 |
| 年度能源成本 | ~103 € | 包含在月度成本中 |
| **年度总成本** | **~103 €** | **~4,440 €** |
| **年度节省** | **~4,337 €** | — |
## 8. 未来改进
- 采用 VLAN 分段 (802.1Q) 隔离生产、网络安全和管理网络
- 通过内部 Step CA 实现 Let's Encrypt TLS
- 根据注册科目设定基于用户的 Jellyfin 媒体库权限
- 将教师内容上传方式从 FTP 迁移至 SFTP
- 使用第二台 Proxmox 节点实现高可用性
- 统一的服务仪表盘(Heimdall 或 Homepage)
- 为包括 ZeroTier IP 在内的所有服务实现完整的 DNS 解析
## 9. 作者
**Sergio Porras Martín**
IES Ágora, 卡塞雷斯 — ASIR 2025/2026
[](https://github.com/Porras-Dev)
## 许可证
本项目基于 MIT 许可证授权 — 详情请参阅 [LICENSE](LICENSE) 文件。
标签:ffuf, Jellyfin, JS文件枚举, MITM代理, Proxmox, Suricata, Wazuh, 测试用例, 版权保护, 现代安全运营, 自定义请求头, 自托管, 视频流媒体平台, 请求拦截, 负责任AI, 逆向工具