docker-compose重建typecho博客

最近阿里云的 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即可。