Docker 部署 Typecho 博客系统(旧版) 🐳

Typecho Banner

Typecho 是一款轻量级的开源博客系统,具有简洁、高效的特点。本指南详细介绍了如何使用 Docker 和 Docker Compose 部署 Typecho 博客系统。

✨ 目录

✨ Typecho 简介

Typecho 是一款基于 PHP 开发的轻量级开源博客系统,具有以下特点:

  • 轻量高效: 核心文件仅约 500KB,资源占用低
  • 🎨 主题丰富: 支持多种主题和模板
  • 🔌 插件生态: 丰富的插件扩展功能
  • 📱 响应式设计: 支持移动设备访问
  • 🔧 简单易用: 后台管理界面简洁直观

教程文档: https://blog.laoda.de/archives/docker-compose-install-typecho
博客前台地址: http://你的服务器IP:8223
博客后台地址: http://你的服务器IP:8223/admin/http://你的服务器IP:8223/jkadmin/


🚀 一、创建必要的文件

1. 创建项目目录结构

1
2
3
4
5
6
7
8
9
# 创建主项目目录
sudo mkdir -p /mnt/mydisk/home/typecho

# 创建子目录
sudo mkdir -p /mnt/mydisk/home/typecho/{php,nginx,mysql/{data,logs,conf},logs,typecho}

# 设置目录权限
sudo chown -R $USER:$USER /mnt/mydisk/home/typecho
sudo chmod -R 755 /mnt/mydisk/home/typecho

2. 创建 MySQL 环境变量文件

1
2
3
4
5
6
7
8
9
10
11
12
cat > /mnt/mydisk/home/typecho/mysql.env <<'EOF'
# MySQL 数据库配置
MYSQL_ROOT_PASSWORD=root_password_123
MYSQL_DATABASE=typecho
MYSQL_USER=typecho_user
MYSQL_PASSWORD=typecho_password_123
MYSQL_CHARSET=utf8mb4
MYSQL_COLLATION=utf8mb4_unicode_ci

# 时区设置
TZ=Asia/Shanghai
EOF

3. 创建 PHP Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
cat > /mnt/mydisk/home/typecho/php/Dockerfile <<'EOF'
FROM php:7.4-fpm

# 设置时区
ENV TZ=Asia/Shanghai

# 安装系统依赖和PHP扩展
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
libzip-dev \
zip \
unzip \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-install zip \
&& docker-php-ext-install opcache

# 配置PHP
RUN echo "output_buffering = 4096" > /usr/local/etc/php/conf.d/php.ini \
&& echo "date.timezone = Asia/Shanghai" >> /usr/local/etc/php/conf.d/php.ini \
&& echo "upload_max_filesize = 20M" >> /usr/local/etc/php/conf.d/php.ini \
&& echo "post_max_size = 20M" >> /usr/local/etc/php/conf.d/php.ini \
&& echo "memory_limit = 128M" >> /usr/local/etc/php/conf.d/php.ini

# 安装Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# 清理缓存
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
EOF

4. 创建 Nginx 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
cat > /mnt/mydisk/home/typecho/nginx/default.conf <<'EOF'
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html index.htm;

access_log /var/log/nginx/typecho_access.log;
error_log /var/log/nginx/typecho_error.log;

# 安全头部
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

# 静态文件缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}

# Typecho URL重写规则
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php$1 last;
}

location / {
try_files $uri $uri/ /index.php?$args;
}

# PHP处理
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;

# 增加超时时间
fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
}

# 禁止访问敏感文件
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}

location ~ /(config|usr/themes|usr/plugins)/.*\.(php|php5|txt|html|htm)$ {
deny all;
access_log off;
log_not_found off;
}
}
EOF

📦 二、下载 Typecho 源码

1. 下载并解压 Typecho

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 进入Typecho目录
cd /mnt/mydisk/home/typecho/typecho

# 下载Typecho最新版
echo "正在下载Typecho..."
wget https://github.com/typecho/typecho/releases/download/v1.2.1/typecho.zip -O typecho.zip

# 如果直接下载失败,可以尝试使用代理或备用链接
if [ ! -f "typecho.zip" ]; then
echo "直接下载失败,尝试使用备用链接..."
wget https://typecho.org/download.php -O typecho.zip
fi

# 解压Typecho
if [ -f "typecho.zip" ]; then
unzip -q typecho.zip
rm -f typecho.zip
echo "Typecho解压成功!"
else
echo "下载失败,请手动下载Typecho并解压到/mnt/mydisk/home/typecho/typecho目录"
echo "下载地址: https://github.com/typecho/typecho/releases"
exit 1
fi

2. 设置文件权限

1
2
3
4
5
6
7
8
9
10
11
# 设置上传目录权限
chmod -R 777 /mnt/mydisk/home/typecho/typecho/usr/uploads

# 设置配置文件权限
chmod 755 /mnt/mydisk/home/typecho/typecho
chmod 644 /mnt/mydisk/home/typecho/typecho/*.php
chmod 644 /mnt/mydisk/home/typecho/typecho/usr/*.php

# 创建安装锁文件(防止重复安装)
touch /mnt/mydisk/home/typecho/typecho/install.lock
chmod 644 /mnt/mydisk/home/typecho/typecho/install.lock

🐳 三、创建 Docker Compose 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
cat > /mnt/mydisk/home/typecho/docker-compose.yml <<'EOF'
services:
nginx:
image: nginx:alpine
container_name: typecho-nginx
ports:
- "8223:80" # 左侧可以改成任意未使用的端口
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
volumes:
- ./typecho:/var/www/html:ro
- ./nginx:/etc/nginx/conf.d:ro
- ./logs/nginx:/var/log/nginx
depends_on:
- php
networks:
- typecho-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3

php:
build: ./php
container_name: typecho-php
restart: unless-stopped
expose:
- "9000"
volumes:
- ./typecho:/var/www/html
- ./logs/php:/var/log/php
environment:
- TZ=Asia/Shanghai
depends_on:
- mysql
networks:
- typecho-network
healthcheck:
test: ["CMD", "php", "-v"]
interval: 30s
timeout: 10s
retries: 3

mysql:
image: mysql:5.7
container_name: typecho-mysql
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
expose:
- "3306"
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/logs:/var/log/mysql
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
env_file:
- mysql.env
networks:
- typecho-network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"]
interval: 30s
timeout: 10s
retries: 3

networks:
typecho-network:
driver: bridge
name: typecho-network
EOF

1. 创建 MySQL 初始化脚本

1
2
3
4
5
6
7
8
9
10
cat > /mnt/mydisk/home/typecho/mysql/init.sql <<'EOF'
-- 创建数据库(如果不存在)
CREATE DATABASE IF NOT EXISTS typecho CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建用户并授权
GRANT ALL PRIVILEGES ON typecho.* TO 'typecho_user'@'%' IDENTIFIED BY 'typecho_password_123';

-- 刷新权限
FLUSH PRIVILEGES;
EOF

2. 启动容器

1
2
3
4
5
6
7
8
9
10
11
# 进入项目目录
cd /mnt/mydisk/home/typecho

# 构建并启动容器
docker-compose up -d

# 查看容器状态
docker-compose ps

# 查看容器日志
docker-compose logs -f

3. 停止并删除容器

1
2
3
4
5
# 停止并删除容器
cd /mnt/mydisk/home/typecho && docker-compose down

# 删除容器并移除数据卷(谨慎操作!)
cd /mnt/mydisk/home/typecho && docker-compose down -v

4. 拉取镜像

1
2
3
4
5
6
7
# 拉取最新镜像
docker pull nginx:alpine
docker pull mysql:5.7
docker pull php:7.4-fpm

# 重新构建PHP镜像
cd /mnt/mydisk/home/typecho && docker-compose build php

🔧 四、容器维护命令

1. 查看所有运行容器的名称

1
2
3
4
docker ps -a --format "{{.Names}}"

# 或者使用docker-compose
docker-compose ps --services

2. 容器生命周期管理

1
2
3
4
5
6
7
8
9
10
11
# 停止Typecho容器
docker-compose stop

# 启动Typecho容器
docker-compose start

# 重启Typecho容器
docker-compose restart

# 强制重启容器
docker-compose restart -t 0

3. 进入容器

1
2
3
4
5
6
7
8
9
10
11
12
# 进入Nginx容器
docker-compose exec nginx sh

# 进入PHP容器
docker-compose exec php bash

# 进入MySQL容器
docker-compose exec mysql bash

# 使用root用户进入MySQL
docker-compose exec mysql mysql -uroot -p
# 输入密码:root_password_123

4. 查看容器日志

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看所有容器日志
docker-compose logs

# 实时查看日志
docker-compose logs -f

# 查看特定容器日志
docker-compose logs nginx
docker-compose logs php
docker-compose logs mysql

# 查看最后N行日志
docker-compose logs --tail 100

5. 容器资源监控

1
2
3
4
5
6
7
8
# 查看容器资源使用情况
docker stats

# 查看特定容器资源使用
docker stats typecho-nginx typecho-php typecho-mysql

# 查看容器进程
docker top typecho-php

⚙️ 五、创建配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
cat > /mnt/mydisk/home/typecho/typecho/config.inc.php <<'EOF'
<?php
/**
* Typecho 配置文件
* 自动生成于 <?php echo date('Y-m-d H:i:s'); ?>
*/

// 数据库设置
$db = new Typecho_Db('Pdo_Mysql', 'typecho_');
$db->addServer(array (
'host' => 'mysql',
'port' => 3306,
'user' => 'typecho_user',
'password' => 'typecho_password_123',
'charset' => 'utf8mb4',
'database' => 'typecho',
'engine' => 'InnoDB',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);

// 站点设置
define('__TYPECHO_ROOT_DIR__', dirname(__FILE__));
define('__TYPECHO_PLUGIN_DIR__', '/usr/plugins');
define('__TYPECHO_THEME_DIR__', '/usr/themes');
define('__TYPECHO_ADMIN_DIR__', '/admin/');

// 安全设置
define('__TYPECHO_SITE_URL__', '');
define('__TYPECHO_SECURE__', true);
define('__TYPECHO_COOKIE_PATH__', '/');

// Gravatar 头像服务器
define('__TYPECHO_GRAVATAR_PREFIX__', 'https://cravatar.cn/avatar/');

// 调试模式
define('__TYPECHO_DEBUG__', false);
define('__TYPECHO_ENABLE_CORS__', false);

// 注册初始化函数
Typecho_Plugin::init();

// 输出缓冲
ob_start();
?>
EOF

Typecho 配置


🗄️ 六、后台配置数据库

访问后台地址:http://你的服务器IP:8223

初始化配置步骤

  1. 打开安装页面: 访问 http://你的服务器IP:8223/install.php
  2. 填写数据库信息:

    • 数据库适配器: Pdo_Mysql
    • 数据库地址: mysql (Docker容器名称)
    • 数据库端口: 3306
    • 数据库用户名: typecho_user
    • 数据库密码: typecho_password_123
    • 数据库名: typecho
    • 数据库前缀: typecho_ (可选)
  3. 设置管理员账户:

    • 填写管理员用户名、密码和邮箱
    • 建议使用强密码
  4. 完成安装:

    • 点击”确认安装”按钮
    • 安装完成后建议删除 install.php 文件

Typecho 数据库配置

安装后检查

1
2
3
4
5
6
7
8
# 检查数据库是否创建成功
docker-compose exec mysql mysql -utypecho_user -ptypecho_password_123 -e "SHOW TABLES FROM typecho;"

# 检查安装锁文件
ls -la /mnt/mydisk/home/typecho/typecho/install.lock

# 删除安装文件(安全考虑)
rm -f /mnt/mydisk/home/typecho/typecho/install.php

🔒 七、修改默认后台登录地址

为了提高安全性,建议修改默认的后台登录地址:

方法一:修改配置文件

1
2
3
4
5
# 编辑 config.inc.php
nano /mnt/mydisk/home/typecho/typecho/config.inc.php

# 找到以下行并修改:
define('__TYPECHO_ADMIN_DIR__', '/my-secret-admin/');

方法二:使用 Nginx 重写规则

1
2
3
4
5
6
7
8
9
10
11
12
# 在 nginx/default.conf 中添加以下规则
location /wp-admin {
return 404;
}

location /administrator {
return 404;
}

location ~* ^/(admin|login|wp-login) {
return 404;
}

方法三:使用身份验证

1
2
3
4
5
6
7
8
9
10
11
# 安装 htpasswd 工具
sudo apt-get install apache2-utils

# 创建认证文件
htpasswd -c /mnt/mydisk/home/typecho/nginx/.htpasswd admin

# 在 nginx 配置中添加认证
location /admin {
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
}

🔄 八、启用地址重写功能

在 Typecho 后台启用地址重写功能,使 URL 更加友好:

  1. 登录 Typecho 后台
  2. 进入”设置” → “永久链接”
  3. 选择”启用地址重写功能”
  4. 选择喜欢的链接格式
  5. 点击”保存设置”

Typecho 地址重写

如果重写不工作,检查以下配置:

1
2
3
4
5
6
7
8
9
10
11
# 检查Nginx配置
docker-compose exec nginx nginx -t

# 重新加载Nginx配置
docker-compose exec nginx nginx -s reload

# 检查文件权限
ls -la /mnt/mydisk/home/typecho/typecho

# 确保.htaccess文件存在
cat /mnt/mydisk/home/typecho/typecho/.htaccess

💡 九、额外提示和优化

1. 备份和恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 备份数据库
docker-compose exec mysql mysqldump -u typecho_user -ptypecho_password_123 typecho > typecho_backup_$(date +%Y%m%d).sql

# 恢复数据库
docker-compose exec -T mysql mysql -u typecho_user -ptypecho_password_123 typecho < typecho_backup.sql

# 备份整个项目
tar -czpf typecho_backup_$(date +%Y%m%d).tar.gz /mnt/mydisk/home/typecho/

# 创建自动备份脚本
cat > /mnt/mydisk/home/typecho/backup.sh <<'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/mnt/mydisk/backups/typecho"

mkdir -p $BACKUP_DIR

# 备份数据库
docker-compose exec mysql mysqldump -u typecho_user -ptypecho_password_123 typecho > $BACKUP_DIR/typecho_db_$DATE.sql

# 备份文件
tar -czf $BACKUP_DIR/typecho_files_$DATE.tar.gz /mnt/mydisk/home/typecho/typecho

# 删除7天前的备份
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete

echo "备份完成: $BACKUP_DIR/typecho_$DATE"
EOF

chmod +x /mnt/mydisk/home/typecho/backup.sh

2. 性能优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 在php/Dockerfile中添加OPcache优化
echo "opcache.enable=1" >> /usr/local/etc/php/conf.d/opcache.ini
echo "opcache.memory_consumption=128" >> /usr/local/etc/php/conf.d/opcache.ini
echo "opcache.max_accelerated_files=4000" >> /usr/local/etc/php/conf.d/opcache.ini
echo "opcache.revalidate_freq=60" >> /usr/local/etc/php/conf.d/opcache.ini

# 在nginx/default.conf中添加Gzip压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;

# 启用浏览器缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}

3. 安全加固

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 在nginx/default.conf中添加安全头
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "strict-origin-when-cross-origin";

# 禁止访问敏感文件
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}

location ~ /(\.env|config\.php|composer\.json|composer\.lock)$ {
deny all;
access_log off;
log_not_found off;
}

4. 监控和日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 安装日志轮转工具
sudo apt-get install logrotate

# 创建日志轮转配置
cat > /etc/logrotate.d/typecho <<'EOF'
/mnt/mydisk/home/typecho/logs/*/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
docker-compose -f /mnt/mydisk/home/typecho/docker-compose.yml restart nginx >/dev/null 2>&1
endscript
}
EOF

🆘 十、常见问题解决

1. 权限问题

1
2
3
4
5
6
7
# 确保所有文件权限正确
sudo chown -R $USER:$USER /mnt/mydisk/home/typecho
sudo chmod -R 755 /mnt/mydisk/home/typecho/typecho
sudo chmod -R 777 /mnt/mydisk/home/typecho/typecho/usr/uploads

# 如果使用SELinux
sudo chcon -Rt httpd_sys_content_t /mnt/mydisk/home/typecho/typecho

2. 数据库连接问题

1
2
3
4
5
6
7
8
9
10
11
# 检查MySQL容器是否正常运行
docker-compose ps mysql

# 检查MySQL日志
docker-compose logs mysql

# 进入MySQL容器检查连接
docker-compose exec mysql mysql -utypecho_user -ptypecho_password_123 -e "SHOW DATABASES;"

# 如果连接失败,检查用户权限
docker-compose exec mysql mysql -uroot -proot_password_123 -e "SELECT user, host FROM mysql.user;"

3. 端口冲突

1
2
3
4
5
6
7
8
9
10
# 检查端口占用
netstat -tulnp | grep :8223
ss -tulnp | grep :8223

# 如果端口已被占用,修改docker-compose.yml中的端口映射
# 将 "8223:80" 改为 "8224:80" 或其他端口

# 重启容器
docker-compose down
docker-compose up -d

4. 容器启动失败

1
2
3
4
5
6
7
8
9
10
11
12
# 查看详细错误信息
docker-compose logs

# 检查Docker Compose文件语法
docker-compose config

# 尝试强制重建容器
docker-compose up -d --force-recreate

# 检查系统资源
docker system df
docker system prune -a # 谨慎操作!

5. 性能问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看容器资源使用情况
docker stats

# 检查PHP进程
docker-compose exec php ps aux

# 检查Nginx访问日志
tail -f /mnt/mydisk/home/typecho/logs/nginx/access.log

# 启用慢查询日志(MySQL)
# 在mysql/conf目录下创建配置文件
echo "[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2" > /mnt/mydisk/home/typecho/mysql/conf/slow-query.cnf

6. 主题和插件问题

1
2
3
4
5
6
7
8
9
10
# 检查主题和插件目录权限
ls -la /mnt/mydisk/home/typecho/typecho/usr/themes/
ls -la /mnt/mydisk/home/typecho/typecho/usr/plugins/

# 重置权限
chmod -R 755 /mnt/mydisk/home/typecho/typecho/usr/themes/
chmod -R 755 /mnt/mydisk/home/typecho/typecho/usr/plugins/

# 检查PHP错误日志
docker-compose exec php tail -f /var/log/php/error.log

通过以上完整的指南,您应该能够成功部署和管理基于 Docker 的 Typecho 博客系统。如果在使用过程中遇到任何问题,请参考相应章节的故障排除部分,或查阅 Typecho 官方文档。