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 [![GitHub](https://img.shields.io/badge/GitHub-Porras--Dev-black?logo=github)](https://github.com/Porras-Dev) ## 许可证 本项目基于 MIT 许可证授权 — 详情请参阅 [LICENSE](LICENSE) 文件。
标签:ffuf, Jellyfin, JS文件枚举, MITM代理, Proxmox, Suricata, Wazuh, 测试用例, 版权保护, 现代安全运营, 自定义请求头, 自托管, 视频流媒体平台, 请求拦截, 负责任AI, 逆向工具