这是一个适合个人自托管的博客项目。
它基于原项目 YYsuni/2025-blog-public 二次改造,保留了漂亮的卡片式首页、文章阅读页、写作页和可视化配置能力,同时把原来依赖 GitHub App / .pem 私钥的编辑方式,改成了更适合普通服务器部署的:
Docker 部署 + 本地文件保存 + 管理员密码登录。
简单说:你不需要懂 GitHub App,不需要上传私钥,也不需要把文章交给第三方服务。把容器跑起来,第一次进入后台设置管理员密码,就可以在网页里写文章、传图片、改首页内容。
- 写博客、编辑博客、删除博客
- 上传封面图和文章图片
- 在写作页一键把图片“填入”文章正文
- 编辑首页内容、头像、背景、导航、社交链接等站点信息
- 管理项目、应用导航、推荐分享、优秀博客、图片、代码片段等内容页
- 本地保存所有运行数据,方便备份和迁移
- 用 Docker 一键部署到服务器、宝塔、1Panel 等环境
原项目的编辑方式需要 GitHub App private key / .pem。这个版本已经改为服务端管理员密码登录。
首次使用时,在页面里初始化管理员密码即可。
博客文章、图片、首页配置、点赞数据、管理员初始化信息等运行数据都保存在 data/。
所以备份和迁移很简单:
备份整个
data/目录即可。
项目内置:
Dockerfiledocker-compose.ymldocker-compose.release.yml.env.example
可以直接本地 build,也可以拉 Docker Hub 镜像运行。
项目里有一份给后续 AI / 智能体看的维护文档:
给下一个智能体也可以编辑此仓库.md如果你以后想继续改功能,可以把仓库和这份文档一起发给 AI,让它先读文档再动手。
适合宝塔、1Panel、普通 Linux 服务器。
mkdir -p /www/wwwroot/2025-blog-local-docker/data && docker run -d \
--name 2025-blog-local-docker \
-p 3000:3000 \
-e NODE_ENV=production \
-e DATA_DIR=/app/data \
-v /www/wwwroot/2025-blog-local-docker/data:/app/data \
--restart unless-stopped \
duanxiaosheng/2025-blog-local-docker:latest启动后访问:
http://服务器IP:3000第一次进入后台、写作页或需要管理权限的地方时,会提示你初始化管理员密码。
适合你要自己改代码。
git clone https://gitee.com/duanxiaosheng/2025-blog-local-docker.git
cd 2025-blog-local-docker
docker compose up -d --buildGitHub 仓库:
git clone https://github.com/duanxiaosheng/2025-blog-public-docker.git
cd 2025-blog-public-docker
docker compose up -d --buildcp .env.example .env
mkdir -p data
docker compose -f docker-compose.release.yml up -d| 页面 | 地址 |
|---|---|
| 首页 | http://服务器IP:3000/ |
| 文章列表 | http://服务器IP:3000/blog |
| 写文章 | http://服务器IP:3000/write |
| 应用导航 | http://服务器IP:3000/apps |
| 我的项目 | http://服务器IP:3000/projects |
| 推荐分享 | http://服务器IP:3000/share |
| 优秀博客 | http://服务器IP:3000/bloggers |
| 关于网站 | http://服务器IP:3000/about |
如果用了域名反代,把 服务器IP:3000 换成你的域名即可。
默认不需要提前配置密码。
第一次访问需要管理权限的页面时,系统会提示你设置管理员密码。设置完成后,就可以登录后台进行修改。
可以在运行容器时传:
-e ADMIN_PASSWORD='你的管理员密码'
-e SESSION_SECRET='一串足够长的随机字符串'说明:
- 设置
ADMIN_PASSWORD后,会跳过页面初始化流程 SESSION_SECRET用于签名登录会话- 如果不设置
SESSION_SECRET,程序会自动生成并保存到data/config/admin-auth.json
分两种情况:
- 如果你用的是
ADMIN_PASSWORD环境变量:改环境变量后重启容器 - 如果你用的是页面初始化密码:删除
data/config/admin-auth.json后重启容器,再重新初始化
默认数据目录:
data/常见内容:
data/config/ 站点配置、管理员登录配置
data/content/ 首页与各内容页数据
data/public/blogs/ 博客文章、封面、文章图片
data/public/images/ 公共上传图片
data/likes/ 点赞数据如果你用上面的一键 Docker 命令部署,宿主机数据目录是:
/www/wwwroot/2025-blog-local-docker/datacd /www/wwwroot/2025-blog-local-docker
tar -czf blog-data-backup.tar.gz data- 在新服务器部署同一个镜像或同一份源码
- 把旧服务器的
data/目录复制过去 - 启动容器
- 访问网站确认内容正常
一句话:
代码可以重新拉,镜像可以重新构建,但
data/一定要保管好。
如果你是 Docker Hub 镜像部署:
docker pull duanxiaosheng/2025-blog-local-docker:latest && docker rm -f 2025-blog-local-docker && docker run -d \
--name 2025-blog-local-docker \
-p 3000:3000 \
-e NODE_ENV=production \
-e DATA_DIR=/app/data \
-v /www/wwwroot/2025-blog-local-docker/data:/app/data \
--restart unless-stopped \
duanxiaosheng/2025-blog-local-docker:latest只要继续挂载同一个 data/ 目录,文章、图片、配置和登录信息都会保留。
本项目使用 pnpm:
pnpm install
pnpm dev开发地址:
http://localhost:2025构建:
pnpm build生产启动:
pnpm start数据健康检查:
pnpm check:data注意:项目声明的包管理器是
pnpm@10.15.0。Dockerfile 也已经使用 pnpm 安装依赖。
| 文件/目录 | 作用 |
|---|---|
src/app/write/ |
写文章、编辑文章页面 |
src/app/blog/ |
文章列表和文章详情页 |
src/components/nav-card.tsx |
首页/全站导航卡片 |
src/app/(home)/config-dialog/ |
首页和站点配置弹窗 |
src/lib/local-admin/ |
本地管理员、文件存储、图片路径等核心逻辑 |
src/app/api/admin/ |
后台管理接口 |
data/ |
运行时数据,部署后最重要的目录 |
给下一个智能体也可以编辑此仓库.md |
给后续 AI/维护者的详细接手说明 |
先检查:
- Docker 容器是否正在运行
- 服务器安全组/防火墙是否放行 3000 端口
- 宝塔/1Panel 是否也放行了端口
- 是否使用了正确 IP 或域名
如果你是 Docker 部署,改完代码后需要重新构建并重启:
docker compose up -d --build大概率是图片路径保存错了,或者临时 blob: 地址被保存进数据。可以运行:
pnpm check:data检查:
data/config/admin-auth.json如果忘记初始化密码,可以删除这个文件后重启容器再重新初始化。
这个项目已经经过较多 AI 辅助改造。继续修改前,建议先读:
给下一个智能体也可以编辑此仓库.md里面记录了项目方向、数据路径、图片路径规则、管理员登录逻辑、容易踩的坑、近期改动和推荐修改流程。
如果你用 AI 继续维护,可以直接告诉它:
先阅读 README.md 和《给下一个智能体也可以编辑此仓库.md》,再修改项目。
duanxiaosheng/2025-blog-local-docker:latest原项目:
https://github.com/YYsuni/2025-blog-public感谢原作者提供漂亮的博客设计和基础代码。本仓库是在此基础上的自托管、本地化、Docker 化改造版本。
MIT