Docker 部署 Typecho 博客系统(旧版) 🐳
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/typechosudo mkdir -p /mnt/mydisk/home/typecho/{php,nginx,mysql/{data,logs,conf},logs,typecho}sudo chown -R $USER :$USER /mnt/mydisk/home/typechosudo 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_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 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 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 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" ; } if (!-e $request_filename ) { rewrite ^(.*)$ /index.php$1 last; } location / { try_files $uri $uri / /index.php?$args ; } 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 cd /mnt/mydisk/home/typecho/typechoecho "正在下载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 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/uploadschmod 755 /mnt/mydisk/home/typecho/typechochmod 644 /mnt/mydisk/home/typecho/typecho/*.phpchmod 644 /mnt/mydisk/home/typecho/typecho/usr/*.phptouch /mnt/mydisk/home/typecho/typecho/install.lockchmod 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/typechodocker-compose up -d docker-compose ps docker-compose logs -f
3. 停止并删除容器 1 2 3 4 5 cd /mnt/mydisk/home/typecho && docker-compose downcd /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 cd /mnt/mydisk/home/typecho && docker-compose build php
🔧 四、容器维护命令 1. 查看所有运行容器的名称 1 2 3 4 docker ps -a --format "{{.Names}}" docker-compose ps --services
2. 容器生命周期管理 1 2 3 4 5 6 7 8 9 10 11 docker-compose stop docker-compose start docker-compose restart docker-compose restart -t 0
3. 进入容器 1 2 3 4 5 6 7 8 9 10 11 12 docker-compose exec nginx sh docker-compose exec php bash docker-compose exec mysql bash docker-compose exec mysql mysql -uroot -p
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 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
🗄️ 六、后台配置数据库 访问后台地址:http://你的服务器IP:8223
初始化配置步骤
打开安装页面 : 访问 http://你的服务器IP:8223/install.php
填写数据库信息 :
数据库适配器 : Pdo_Mysql
数据库地址 : mysql
(Docker容器名称)
数据库端口 : 3306
数据库用户名 : typecho_user
数据库密码 : typecho_password_123
数据库名 : typecho
数据库前缀 : typecho_
(可选)
设置管理员账户 :
完成安装 :
点击”确认安装”按钮
安装完成后建议删除 install.php 文件
安装后检查 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.lockrm -f /mnt/mydisk/home/typecho/typecho/install.php
🔒 七、修改默认后台登录地址 为了提高安全性,建议修改默认的后台登录地址:
方法一:修改配置文件 1 2 3 4 5 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 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 sudo apt-get install apache2-utilshtpasswd -c /mnt/mydisk/home/typecho/nginx/.htpasswd admin location /admin { auth_basic "Admin Area" ; auth_basic_user_file /etc/nginx/conf.d/.htpasswd; }
🔄 八、启用地址重写功能 在 Typecho 后台启用地址重写功能,使 URL 更加友好:
登录 Typecho 后台
进入”设置” → “永久链接”
选择”启用地址重写功能”
选择喜欢的链接格式
点击”保存设置”
如果重写不工作,检查以下配置: 1 2 3 4 5 6 7 8 9 10 11 docker-compose exec nginx nginx -t docker-compose exec nginx nginx -s reload ls -la /mnt/mydisk/home/typecho/typechocat /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' 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 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 echo "opcache.enable=1" >> /usr/local/etc/php/conf.d/opcache.iniecho "opcache.memory_consumption=128" >> /usr/local/etc/php/conf.d/opcache.iniecho "opcache.max_accelerated_files=4000" >> /usr/local/etc/php/conf.d/opcache.iniecho "opcache.revalidate_freq=60" >> /usr/local/etc/php/conf.d/opcache.inigzip 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 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 logrotatecat > /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/typechosudo chmod -R 755 /mnt/mydisk/home/typecho/typechosudo chmod -R 777 /mnt/mydisk/home/typecho/typecho/usr/uploadssudo chcon -Rt httpd_sys_content_t /mnt/mydisk/home/typecho/typecho
2. 数据库连接问题 1 2 3 4 5 6 7 8 9 10 11 docker-compose ps mysql docker-compose logs 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 down docker-compose up -d
4. 容器启动失败 1 2 3 4 5 6 7 8 9 10 11 12 docker-compose logs 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 docker-compose exec php ps aux tail -f /mnt/mydisk/home/typecho/logs/nginx/access.logecho "[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/docker-compose exec php tail -f /var/log/php/error.log
通过以上完整的指南,您应该能够成功部署和管理基于 Docker 的 Typecho 博客系统。如果在使用过程中遇到任何问题,请参考相应章节的故障排除部分,或查阅 Typecho 官方文档。
Docker 部署 Typecho 博客系统(旧版)🐳