摘要:MX CMS 开发与部署指南 本文档记录了从项目初始化到当前稳定版本的完整开发脉络与技术决策过程,并提供了详细的部署与维护指南。3. 业务架构演进 (Business Architecture Evolution) 除了基础设施的完善,MX CMS 在业务功能上也经历了四个关键阶段,从基础管理到成熟的发布引擎打包: 将 HTML、CSS (自动聚合组件样式)、JS 库打包为 Zip 文件。
本文档记录了从项目初始化到当前稳定版本的完整开发脉络与技术决策过程,并提供了详细的部署与维护指南。
从软件工程的角度来看,本项目的开发遵循了典型的迭代式开发流程,但由于基础设施(Docker/DB)的复杂性,在“集成与部署”阶段经历了多次螺旋式上升的优化。
graph TD %% Phase 1: Initialization Start((项目启动)) --> Req[需求分析<br/>CMS内容管理 + RBAC权限 + 静态发布] Req --> Arch[架构选型<br/>FastAPI + React + MariaDB<br/>Docker单容器全栈部署] %% Phase 2: Implementation (Parallel) subgraph Implementation [核心开发阶段] direction TB Dev_Back[后端开发<br/>Auth/Schema/ORM] Dev_Front[前端开发<br/>PageBuilder/组件库] Dev_Core[核心引擎<br/>SSG静态生成/Jinja2渲染] Dev_Back <--> Dev_Front Dev_Back --> Dev_Core end Arch --> Implementation %% Phase 3: Infrastructure (The Challenge) Implementation --> Docker[容器化封装<br/>Dockerfile + Supervisord] %% Phase 4: Integration & Stabilization (The "Fix" Loop) subgraph Stabilization [集成与稳态收敛] Docker --> Deploy{部署验证} Deploy -- "Fail: 连不上库" --> Fix_Net[网络层修正<br/>Bind 0.0.0.0 / Env Vars] Fix_Net --> Deploy Deploy -- "Fail: 无初始数据" --> Fix_Data[数据层修正<br/>entrypoint.sh导入init.sql] Fix_Data --> Deploy Deploy -- "Fail: 进程退出/无日志" --> Fix_Proc[进程层修正<br/>Supervisord配置 / Stdout重定向] Fix_Proc --> Deploy Deploy -- "Fail: 图片丢失" --> Fix_Vol[持久化修正<br/>Volume挂载 / 资源预填充] Fix_Vol --> Deploy end %% Phase 5: Delivery Deploy -- "Pass: 验证通过" --> Auto[工程化完善<br/>deploy.py自动化脚本] Auto --> Release((项目交付))
在软件工程实践中,本项目经历了以下几个关键决策点(Critical Decision Points),这些节点直接决定了项目的最终形态:
架构决策:单容器全栈 (All-in-One Container)
数据策略:以代码为中心 vs 以数据为中心
可观测性:从黑盒到白盒
自动化:脚本即文档 (Infrastructure as Code)
deploy.py
目标: 建立前后端分离的基础架构。
User
Role
Menu
Page
auth.py
目标: 将所有服务打包到一个 Docker 容器中,简化交付。
python:3.12-slim
上下文: 部署后发现数据库表结构虽然创建了(通过 SQLAlchemy create_all),但 users、menus 等基础数据缺失,导致无法登录。
create_all
users
menus
seed.py
deploy/init.sql
entrypoint.sh
mysqladmin shutdown
上下文: 容器内需要同时运行 Nginx (Web Server) 和 Uvicorn (App Server)。
&
deploy/supervisord.conf
nodaemon=true
daemon off;
上下文: 部署后外部无法访问,或者访问报错 502/Connection Refused。
127.0.0.1
0.0.0.0
localhost
/var/log/...
docker logs
/dev/stdout
/dev/stderr
nginx.conf
--reload
上下文: 重新部署后,用户上传的图片(CMS 内容)丢失;前端页面图片 404。
/opt/mx-cms/static
/app/static
:Z
static
上下文: 每次手动执行 Docker 命令太繁琐,且容易出错。
--build
npm run build
--reset-db
除了基础设施的完善,MX CMS 在业务功能上也经历了四个关键阶段,从基础管理到成熟的发布引擎:
核心需求: 系统需要多角色支持,不同角色看到不同菜单。
main.py
read_menus
核心需求: 允许非技术人员通过可视化方式搭建页面。
content
Component
Resource
核心需求: 将搭建好的 JSON 页面转化为独立的 HTML 静态网站,并支持远程部署。
publish_page
code
props
DataSource
核心需求: 监控系统使用情况,及时触达系统通知。
LoginLog
OperationLog
SystemMessage
UserMessageStatus
单容器全栈架构 (All-in-One):
All-in-One
frontend/dist
/usr/share/nginx/html
backend/
/app/backend
static/
/etc/supervisor/conf.d/supervisord.conf
在项目根目录下执行 deploy.py:
日常快速部署 (代码更新):
python deploy.py
仅更新后端代码和前端静态文件,重启容器。不重置数据库。
完整发布 (前端构建 + 部署):
python deploy.py --build
先执行 npm build,再部署。
初始化/重置环境 (清空数据):
python deploy.py --build --reset-db
警告:这将删除服务器数据库数据,并重新导入 init.sql。
init.sql
docker logs mx-cms-container
index.html
/var/lib/mysql
python deploy.py --reset-db
order_by(created_at.desc(), id.desc())
DOCKER_PORT
requirements.txt
MX CMS 开发与部署指南
本文档记录了从项目初始化到当前稳定版本的完整开发脉络与技术决策过程,并提供了详细的部署与维护指南。
1. 软件工程全生命周期视图 (Software Engineering Lifecycle)
从软件工程的角度来看,本项目的开发遵循了典型的迭代式开发流程,但由于基础设施(Docker/DB)的复杂性,在“集成与部署”阶段经历了多次螺旋式上升的优化。
1.1 开发全流程图 (Development Flowchart)
1.2 关键里程碑节点分析 (Key Milestones Analysis)
在软件工程实践中,本项目经历了以下几个关键决策点(Critical Decision Points),这些节点直接决定了项目的最终形态:
架构决策:单容器全栈 (All-in-One Container)
数据策略:以代码为中心 vs 以数据为中心
可观测性:从黑盒到白盒
自动化:脚本即文档 (Infrastructure as Code)
deploy.py。2. 基础设施演进 (Infrastructure Evolution)
阶段 0: 项目骨架搭建 (Foundation)
目标: 建立前后端分离的基础架构。
User,Role,Menu,Page(CMS Core).auth.py).阶段 1: 容器化与初次部署尝试 (Dockerization)
目标: 将所有服务打包到一个 Docker 容器中,简化交付。
python:3.12-slim作为基础镜像,在容器内同时安装 MariaDB Server, Nginx 和 Python 环境。阶段 2: 数据库初始化攻坚 (Database Initialization)
上下文: 部署后发现数据库表结构虽然创建了(通过 SQLAlchemy
create_all),但users、menus等基础数据缺失,导致无法登录。seed.py。但生产环境需要更复杂的初始数据(如演示页面)。deploy/init.sql。entrypoint.sh脚本,实现“启动临时 mysqld -> 导入 SQL -> 关闭临时 mysqld -> 启动正式服务”的逻辑。mysqladmin shutdown)。阶段 3: 进程管理与服务编排 (Process Management)
上下文: 容器内需要同时运行 Nginx (Web Server) 和 Uvicorn (App Server)。
&) 导致进程管理混乱,且无法捕获日志。Nginx 经常静默失败。deploy/supervisord.conf。nodaemon=true让 Supervisord 前台运行;设置 Nginxdaemon off;。阶段 4: 网络连通性与日志调试 (Networking & Debugging)
上下文: 部署后外部无法访问,或者访问报错 502/Connection Refused。
127.0.0.1,修改为0.0.0.0以防万一(虽单容器内通信其实localhost够用,但排查时需要)。/var/log/...,docker logs看不到。/dev/stdout和/dev/stderr。nginx.conf语法错误(多余括号)。--reload。阶段 5: 静态资源持久化 (Static Assets)
上下文: 重新部署后,用户上传的图片(CMS 内容)丢失;前端页面图片 404。
deploy.py中挂载宿主机/opt/mx-cms/static到容器/app/static。:Z选项。static资源过去,确保初始资源存在。阶段 6: 自动化部署脚本完善 (Deployment Script)
上下文: 每次手动执行 Docker 命令太繁琐,且容易出错。
deploy.py。--build: 自动调用npm run build编译前端。--reset-db: 危险操作开关,控制是否重置数据库。3. 业务架构演进 (Business Architecture Evolution)
除了基础设施的完善,MX CMS 在业务功能上也经历了四个关键阶段,从基础管理到成熟的发布引擎:
阶段 1: 权限与管理基座 (RBAC & Admin Foundation)
核心需求: 系统需要多角色支持,不同角色看到不同菜单。
User<->Role<->Menu的多对多关系。auth.py进行 Token 签发与校验;main.py中的read_menus接口根据当前用户角色动态返回菜单树。阶段 2: CMS 内容引擎 (Content Engine)
核心需求: 允许非技术人员通过可视化方式搭建页面。
Page表的content字段。Component模型(含 HTML/CSS/JS/Schema),支持动态注册新组件(如轮播图、文章列表)。Resource模块,支持图片上传与管理,供组件引用。阶段 3: 静态站点生成与发布 (SSG & Publishing)
核心需求: 将搭建好的 JSON 页面转化为独立的 HTML 静态网站,并支持远程部署。
publish_page):Page的 JSON 数据。code) 和属性 (props) 生成 HTML 片段。DataSource(API 数据预取)和Resource(本地图片路径替换)。阶段 4: 运维与可观测性 (Operational Maturity)
核心需求: 监控系统使用情况,及时触达系统通知。
LoginLog: 记录登录 IP、时间、状态(成功/失败)。优化点:增加按 ID 倒序排列,确保最新记录置顶。OperationLog: 记录关键操作(如删除用户、发布页面)。SystemMessage模块,支持向特定角色发送站内信,并追踪已读状态 (UserMessageStatus)。4. 当前架构说明 (Current Architecture)
容器拓扑
单容器全栈架构 (
All-in-One):目录结构映射
frontend/dist/usr/share/nginx/htmlbackend//app/backendstatic//app/staticdeploy/supervisord.conf/etc/supervisor/conf.d/supervisord.conf5. 部署操作指南 (Operation Guide)
前置条件
常用指令
在项目根目录下执行
deploy.py:日常快速部署 (代码更新):
仅更新后端代码和前端静态文件,重启容器。不重置数据库。
完整发布 (前端构建 + 部署):
先执行 npm build,再部署。
初始化/重置环境 (清空数据):
警告:这将删除服务器数据库数据,并重新导入
init.sql。6. 故障排查手册 (Troubleshooting)
Q1: 部署后页面白屏或 404?
docker logs mx-cms-container查看是否有 Nginx 报错。/usr/share/nginx/html是否有index.html。Q2: 数据库数据未更新或为空?
init.sql但部署后没生效。/var/lib/mysql) 已有数据,entrypoint.sh就会跳过初始化。python deploy.py --reset-db强制重置。Q3: 登录日志排序不对?
order_by(created_at.desc(), id.desc())。如仍有问题,检查服务器与容器时区是否一致。Q4: 端口冲突?
deploy.py中的DOCKER_PORT配置,或停止占用该端口的其他服务。Q5: 无法连接后端 API (500/502)?
docker logs mx-cms-container确认 Python 是否有 Traceback 报错。requirements.txt)、环境变量配置错误。