dpz.core
dpz.core 是一个基于 .NET 10 (ASP.NET Core) 构建的现代化个人综合平台/CMS 系统。该项目采用分层架构设计,集成了内容管理、身份认证、实时通讯、多媒体管理等丰富功能,旨在打造一个高性能、可扩展的个人数字化中心。
🏗️ 项目结构
项目采用典型的分层架构,主要包含以下核心模块:
- Dpz.Core.Web: 核心 Web 前端/后端应用(MVC),处理用户界面、交互逻辑及页面渲染。
- Dpz.Core.Auth: 基于 OpenIddict 的统一认证中心(SSO),提供 OAuth2/OIDC 认证服务。
- Dpz.Core.WebApi: 对外 RESTful API 服务,支持移动端或第三方集成。
- Dpz.Core.Service: 核心业务逻辑层,封装了所有领域服务(如文章、评论、弹幕、多媒体等)。
- Dpz.Core.MongodbAccess: 基于 MongoDB 的数据访问层,实现了仓储模式和工作单元。
- Dpz.Core.Infrastructure: 基础设施层,提供通用工具和底层支持。
- Dpz.Core.Hangfire: 后台任务处理模块,用于定时任务和异步作业。
✨ 功能特性
📝 内容管理
- 博客文章: 支持 Markdown 编写、分类、标签及全文检索。
- 动态 (Mumble): 类似微博/推特的微型博客,记录碎片化想法。
- 代码片段: 管理和分享常用代码块。
- 动态页面: 自定义页面内容管理。
💬 互动社交
- 评论系统: 支持多级评论、表情包。
- 实时聊天: 基于 SignalR 的即时通讯,支持群聊。
- 弹幕系统: 视频或页面的实时弹幕互动。
🎬 多媒体与娱乐
- 影音管理: 音乐、视频播放与管理。
- Steam 集成: 展示 Steam 游戏库及状态。
- 图片管理: 相册与图片存储。
🛡️ 系统与安全
- 统一认证: 集中式账号管理,支持 2FA 双因素认证。
- 安全防护: IP 限流、爬虫拦截、日志审计。
- 数据备份: 自动化的备份与恢复机制。
🛠 技术栈
- 框架: .NET 10 Preview (ASP.NET Core)
- 数据库: MongoDB (主要存储), Redis (缓存/SignalR底板)
- ORM/数据访问: 自研 Repository 模式 (Dpz.Core.MongodbAccess)
- 认证授权: OpenIddict, ASP.NET Core Identity
- 配置中心: AgileConfig
- 后台任务: Hangfire
- 实时通讯: SignalR
- 日志监控: Serilog, Seq
- 前端构建: esbuild (用于处理静态资源)
- Web 服务器: Kestrel, Caddy (反向代理)
📏 编码约定
- 缩进使用 4 个空格
- 返回单个对象时,需要根据语义返回可空引用类型或者不可空引用类型
- 返回集合/数组时,除必要外(例如 byte[]? ) ,如果没有数据都应该返回一个没有任何项的空数集合/数组
- 参数类型应该尽可能的抽象,返回值的类型应该尽可能的具体
- 记录日志时,禁止拼接字符串,而是应该使用结构化日志
- IEnumerable
类型不应该重复枚举 - 语义冲突时,入参和出参应该分离,而不是共用一个类型
- 私有字段成员使用
_前缀,并使用驼峰命名 - 不应该存在公开的字段
- 参数、变量 使用驼峰命名
- 类、结构体、接口、方法、属性、事件等使用 Pascal 命名
- if for foreach while 等代码块,即使只有一行代码,也请使用大括号
- 每行代码的的最大长度:100
- 命名空间应该使用 项目名.目录(.子目录)
- 命名空间使用文件作用域命名空间
- 如果只有一个构造函数的情况下,应该使用主构造函数
🔧 运维与部署参考 (DevOps)
以下命令主要用于服务器维护和相关服务的部署。
Docker 资源清理
# 删除所有未使用的Docker资源
sudo docker system prune -a --volumes
删除内容包括:停止的容器、未使用的网络、未引用的卷(⚠️)、悬挂镜像、未使用的镜像、构建缓存。
导出 git 提交日志
git log --stat --since="2025-12-03" > detailed_log.txt
Seq 日志服务部署
# 拉取镜像
sudo docker pull docker.1ms.run/datalust/seq:latest
sudo docker run \
--name seq \
-d \
--restart unless-stopped \
-e ACCEPT_EULA=Y \
-e SEQ_API_CANONICALURI=https://logs.dpangzi.com \
-v /home/ubuntu/seq/data:/data \
-p 2370:80 \
-p 5341:5341 \
docker.1ms.run/datalust/seq:latest
SSH Key 生成
ssh-keygen -t rsa -C "pengqian089@hotmail.com"
cat ~/.ssh/id_rsa.pub
Caddy Web 服务器
# 验证配置文件
caddy validate --config /etc/caddy/Caddyfile
# 格式化配置文件
sudo caddy fmt --overwrite --config /etc/caddy/Caddyfile
# 重新加载配置文件
caddy reload --config /etc/caddy/Caddyfile
Redis 安装
sudo apt update
sudo apt install redis-server
# 编辑配置: bind 127.0.0.1 ::1, requirepass foobared
sudo vim /etc/redis/redis.conf
sudo systemctl restart redis.server
第三方服务部署
Alist (文件列表程序)
sudo docker pull xhofe/alist:latest
sudo docker run \
--restart=unless-stopped \
-v /home/ubuntu/alist:/opt/alist/data \
-p 2375:5244 \
-e PUID=0 \
-e PGID=0 \
-e UMASK=022 \
-e TZ=Asia/Shanghai \
--name="alist" \
-d xhofe/alist
Docker 镜像源配置参考:
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
]
}
OpenList
sudo docker run \
--user $(id -u):$(id -g) \
--restart=unless-stopped \
-v /home/pengqian/program/openlist/data:/opt/openlist/data \
-v /home/pengqian/program/openlist/storage:/opt/openlist/storage \
-p 6830:5244 \
-e UMASK=022 \
--name="openlist" \
-d openlistteam/openlist:latest
Jellyfin (媒体服务器)
sudo docker pull jellyfin/jellyfin
sudo docker run \
--name jellyfin \
-p 8096:8096 \
-v /home/pengqian/program/jellyfin/config:/config \
-v /home/pengqian/program/jellyfin/cache:/cache \
-v /home/pengqian/program/jellyfin/media:/media \
--restart unless-stopped \
-d jellyfin/jellyfin
Gitea (Git 服务)
mkdir -p /home/pengqian/program/gitea/{data,db}
sudo docker run -d \
--name gitea \
-p 3379:3000 \
-p 222:22 \
-v /home/pengqian/program/gitea/data:/data \
-v /home/pengqian/program/gitea/db:/data/gitea/db \
-e USER_UID=$(id -u) \
-e USER_GID=$(id -g) \
--restart unless-stopped \
-d gitea/gitea:latest
Aria2 (下载工具)
端口说明:
- 6800 TCP: RPC 控制端口
- 6888 TCP: BitTorrent 监听端口
- 6888 UDP: DHT 网络端口
sudo docker run -d \
--name aria2 \
-p 6800:6800 \
-p 6888:6888 \
-p 6888:6888/udp \
-v /home/pengqian/program/aria2/config:/config \
-v /home/pengqian/program/aria2/downloads:/downloads \
-e RPC_SECRET=YourSecurePassword \
--restart unless-stopped \
p3terx/aria2-pro:latest
qBittorrent
sudo docker run -d \
--name qbittorrent \
-p 3373:3373 \
-p 6881:6881 \
-p 6881:6881/udp \
-e PUID=1000 \
-e PGID=1000 \
-e UMASK=002 \
-e TZ="Asia/Shanghai" \
-e WEBUI_PORT=3373 \
-v /home/pengqian/program/qbt/config:/config \
-v /home/pengqian/program/qbt/downloads:/downloads \
-v /home/pengqian/program/openlist/data:/opt/openlist/data \
--restart unless-stopped \
docker.1ms.run/linuxserver/qbittorrent:latest
评论加载中...