使用 Docker 搭建个人博客:Nginx Proxy Manager + Typecho + MariaDB 完整实践
最近在一台 OVH VPS 上重新规划个人博客环境,希望搭建一个稳定、安全、方便扩展的 Docker 化博客系统。
最终采用:
- Debian
- Docker Compose
- Nginx Proxy Manager
- Typecho
- MariaDB
- Docker 网络隔离
本文记录整个搭建过程。
一、服务器环境
服务器配置:
- CPU:Intel Core i7-7700K
- 内存:32GB
- 硬盘:双 SSD
- 带宽:1Gbps
- 系统:Debian
服务器用途:
- 个人博客
- 图床
- 邮件服务
- 其他 Web 服务
因此采用服务隔离的 Docker 架构。
二、整体架构
最终架构:
Internet
|
|
HTTPS 443
|
|
Nginx Proxy Manager
(反向代理)
|
Docker proxy 网络
|
+-------------+
| |
Typecho 其他服务
|
database 网络
|
MariaDB设计原则:
- 只开放必要公网端口
- 应用不直接暴露公网
- 数据库只允许内部访问
- 使用 Docker 网络通信
三、Nginx Proxy Manager 部署
Nginx Proxy Manager 负责:
- 域名转发
- HTTPS SSL 证书
- 反向代理
- Web 服务入口
目录:
/opt/docker/nginx-proxy-managerdocker-compose:
services:
npm:
image: jc21/nginx-proxy-manager:2.15.1
container_name: nginx-proxy-manager
restart: always
ports:
- "80:80"
- "443:443"
- "127.0.0.1:81:81"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
- proxy
networks:
proxy:
external: true四、为什么关闭 81 公网访问?
Nginx Proxy Manager 默认:
0.0.0.0:81代表:任何人都可以访问后台。
修改为:
127.0.0.1:81:81之后:
公网
|
X
|
81 关闭
本机
|
127.0.0.1:81
|
NPM 后台如果需要远程管理,使用 SSH 隧道:
ssh -L 8081:127.0.0.1:81 alice@服务器IP -p 22222浏览器访问:
http://127.0.0.1:8081五、创建 Docker 公共网络
创建:
docker network create proxy作用:让不同 Docker Compose 项目之间通信。
例如:
proxy
├── nginx-proxy-manager
└── typechoexternal 网络作用
配置:
networks:
proxy:
external: true表示:Docker Compose 使用已经存在的网络,不会重新创建。
这样 NPM 可以直接访问:
typecho:80六、部署 Typecho
使用镜像:
joyqi/typecho:1.3.0-php8.2-apache该镜像包含:
- Typecho
- Apache
- PHP 8.2
目录:
/opt/docker/typechodocker-compose:
services:
mariadb:
image: mariadb:11
container_name: typecho-db
restart: always
environment:
MYSQL_ROOT_PASSWORD: your_root_password
MYSQL_DATABASE: typecho
MYSQL_USER: typecho
MYSQL_PASSWORD: your_password
volumes:
- ./mysql:/var/lib/mysql
networks:
- database
typecho:
image: joyqi/typecho:1.3.0-php8.2-apache
container_name: typecho
restart: always
depends_on:
- mariadb
environment:
TYPECHO_SITE_URL: https://blog.example.com
TYPECHO_DB_ADAPTER: Pdo_Mysql
TYPECHO_DB_HOST: mariadb
TYPECHO_DB_PORT: 3306
TYPECHO_DB_USER: typecho
TYPECHO_DB_PASSWORD: your_password
TYPECHO_DB_DATABASE: typecho
volumes:
- ./typecho:/app/usr
networks:
- proxy
- database
networks:
proxy:
external: true
database:七、为什么 Typecho 没有 ports?
传统方式:
ports:
- "8080:80"访问方式:
服务器IP:8080但是现在架构是:
用户
|
443
|
Nginx Proxy Manager
|
Docker 内部网络
|
Typecho所以 Typecho 不需要 ports: 配置。
最终:
- 公网:
80、443 - 内部:
Typecho:80、MariaDB:3306
八、MariaDB 数据库隔离
MariaDB 只加入 database 网络。
结构:
Typecho
|
database
|
MariaDB数据库不会暴露公网,不会开放 3306 端口。
九、启动服务
检查配置:
docker compose config启动:
docker compose up -d查看:
docker ps最终运行的容器:
nginx-proxy-managertypechotypecho-db
十、测试 Docker 网络
进入 NPM 容器:
docker exec -it nginx-proxy-manager bash测试:
curl http://typecho返回 302 Redirect,说明:
NPM
|
proxy 网络
|
Typecho通信正常。
十一、NPM 配置博客域名
添加 Proxy Host:
- Domain Names:
blog.example.com - Forward Scheme:
http - Forward Hostname:
typecho - Forward Port:
80
SSL 配置:
- 开启 Force SSL
- 开启 HTTP/2 Support
- 申请 Let's Encrypt 证书
访问 https://blog.example.com 即可进入 Typecho 安装页面。
数据库配置:
- 数据库地址:
mariadb - 数据库名:
typecho - 用户名:
typecho - 密码:设置的
MYSQL_PASSWORD
十二、最终端口规划
公网开放:
| 端口 | 用途 |
|---|---|
| 22222 | SSH |
| 80 | HTTP |
| 443 | HTTPS |
关闭:
| 端口 | 用途 |
|---|---|
| 81 | NPM 后台 |
| 3306 | MariaDB |
| 8080 | Typecho |
十三、最终架构总结
当前服务器结构:
Docker
│
├── nginx-proxy-manager
│ |
│ ├── 80
│ ├── 443
│ └── 127.0.0.1:81
│
├── typecho
│ |
│ └── Apache + PHP
│
└── typecho-db
|
└── MariaDB特点:
- ✅ 服务隔离
- ✅ 数据持久化
- ✅ HTTPS 自动管理
- ✅ 数据库不暴露公网
- ✅ 后续扩展方便
未来可以继续增加:
proxy 网络:
├── Typecho
├── MinIO 图床
├── Uptime Kuma 监控
└── 其他 Web 服务database 网络:
├── MariaDB
├── Redis
└── PostgreSQL这套 Docker 架构可以作为个人服务器长期运行的基础环境。