folder-github
folder-docs
folder-src
git
visualstudio
readme

build dpz.core program

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
评论加载中...