docker-compose重建typecho博客

文章最后更新时间为:2023年08月09日 16:43:43

最近阿里云的 ecs 快要到期了,打算继续续费,没想到我这1核2G1M的小主机一年竟然要一千多块钱,看来毕业了是真的用不了套路云了,于是打算把博客搬个家,搬到前段时间四年四百块买的良心云上去。

话说我这个小博客是大一的时候利用 lnmp 搭建的,迁移起来也很麻烦,尤其是我还改过数据库的字段,直接利用 typecho 的备份功能是不行的。于是想着一劳永逸用 docker-compose 搭一套新的,下次迁移就直接复制整个目录就行了,备份数据也很方便。

目录如下

.
├── docker-compose.yml
├── logs
├── mysql
├── mysql.env
├── nginx
│   └── default.conf
├── php
│   └── Dockerfile
└── typecho

和lnmp一样,涉及到三个镜像 mysql + php-fpm + nginx

docker-compose

  • ./docker-compose.yml

    version: "3"
    
    services:
    nginx:
      image: nginx:1.19.10
      ports:
        - "80:80"
      restart: always
      environment:
        - TZ=Asia/Shanghai
      volumes:
        - ./typecho:/var/www/html
        - ./nginx:/etc/nginx/conf.d
        - ./logs:/var/log/nginx
      depends_on:
        - php
      networks:
        - web
    
    php:
      build: php
      restart: always
      expose:
        - "9000"
      volumes:
        - ./typecho:/var/www/html
      environment:
        - TZ=Asia/Shanghai
      depends_on:
        - mysql
      networks:
        - web
    
    mysql:
      image: mysql:5.7
      restart: always
      environment:
        - TZ=Asia/Shanghai
      expose:
        - "3306"
      volumes:
        - ./mysql/data:/var/lib/mysql
        - ./mysql/logs:/var/log/mysql
        - ./mysql/conf:/etc/mysql/conf.d
      env_file:
        - mysql.env
      networks:
        - web
    
    networks:
      web:
    

mysql

没什么好说的

  • ./mysql.env

    MYSQL_ROOT_PASSWORD=root_pass
    MYSQL_DATABASE=typecho
    MYSQL_USER=username
    MYSQL_PASSWORD=password

php-fpm

其中 php 目录为 php-fpm 的 Dockerfile,在官方镜像的基础上,添加了 PDO_MYSQL(如果使用 MySQL 作为 Typecho 的数据库,则需安装此扩展),并设置 buffer 为 4kb,即一个内存页。同时设置了时区为RPC,来源于issue: https://github.com/typecho/typecho/issues/1090

  • ./php/Dockerfile

    FROM php:7.4-fpm-buster
    
    RUN apt-get update \
      && docker-php-ext-install pdo_mysql \
      && echo "output_buffering = 4096" > /usr/local/etc/php/conf.d/php.ini \
      && echo "date.timezone = PRC" >> /usr/local/etc/php/conf.d/php.ini
    

nginx

nginx 的配置要注意的是需要有 rewrite 规则,如果需要指定域名的话,需要写 server_name 字段。这里我并没有指定443端口,因为我的博客的 ssl 是在 cdn 那里做的。

  • ./nginx/default.conf

    server {
      listen 80 default_server;
      root /var/www/html;
      index index.php;
    
      access_log /var/log/nginx/typecho_access.log main;
      if (!-e $request_filename) {
          rewrite ^(.*)$ /index.php$1 last;
      }
      location / {
          index index.html index.htm index.php;
    
          if (!-e $request_filename) {
              rewrite . /index.php last;
          }
      }
    
      location ~ \.php(.*)$ {
          fastcgi_pass   php:9000;
          fastcgi_index  index.php;
          fastcgi_param  PATH_TRANSLATED $document_root$fastcgi_path_info;
          fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
          fastcgi_param  PATH_INFO  $fastcgi_path_info;
          fastcgi_param  SCRIPT_NAME $fastcgi_script_name;
          fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include        fastcgi_params;
      }
    }
    

其他

  • 无法上传图片

    sudo chmod -R 777 /path/to/blog/usr/uploads
  • mysql数据导入导出

docker-compose起来后,需要导入mysql数据。

mysql导入导出语句:

# 导出typecho数据库
mysqldump -uroot -p --databases typecho >/tmp/typecho.sql

# 导入typecho数据库
mysql -u root -p
mysql>use typecho
mysql>source /tmp/typecho.sql
  • 复制源码到typecho目录下

将之前的目录复制到typecho目录下即可。

  • 之后的备份迁移

之后迁移只需要复制整个目录,然后重启docker-compose up即可。

1 + 1 =
4 评论
    Aktata Chrome 115 Windows 10
    2023年08月09日 回复

    感谢分享,对我帮助很大!我在复现过程中遇到了两个问题,可以依此更新文档。

    1. docker-compose.yml文件结尾存在缩进问题。

      # networks:
      # web:
      # 改为:
      networks:
        web:
    1. Dockerfile中使用的php:7.2.3-fpm正在使用Debian Stretch作为基础镜像的一部分,现在可能已经不再受支持,因此其中的一些URL可能已经不可用。可以尝试使用Debian Buster(Debian 10)或者更高版本作为底层系统。

      以下是更新后的Dockerfile代码示例:

      FROM php:7.4-fpm-buster
      
      RUN apt-get update \
        && docker-php-ext-install pdo_mysql \
        && echo "output_buffering = 4096" > /usr/local/etc/php/conf.d/php.ini \
        && echo "date.timezone = PRC" >> /usr/local/etc/php/conf.d/php.ini
      saucerman Chrome 114 OSX
      2023年08月09日 回复

      @Aktata 感谢指正,已修改

    cherry Chrome 103 Windows 10
    2022年07月22日 回复

    楼主你这个是什么主题?

    2 Chrome 90 Windows 10
    2021年05月19日 回复

    666