我想要之后重装一下系统,准备先把 Typecho 给容器化,这样也方便我重装时迁移数据。查了查,感觉也不是很难。

首先 Typecho 需要 PHP 的运行环境,我选择了 NginxPHP-FPM 的组合,同时还加上了 acme.sh 来签发证书,使用了 Docker-Compose 来管理,配置如下:

version: "3.7"
services:

  nginx:
    image: nginx:mainline-alpine
    container_name: nginx
    labels:
      - sh.acme.autoload.domain=hehome.xyz
    ports:
      - "80:80"
      - "443:443"
    restart: always
    volumes:
      - ./typecho:/app/typecho
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./sites:/etc/nginx/sites-enabled:ro
      - ./ssl:/etc/nginx/ssl
      - ./logs:/var/log/nginx

  php-fpm:
    image: php:7.3-fpm-alpine
    container_name: php-fpm
    restart: always
    volumes:
      - ./typecho:/app/typecho

  acme.sh:
    image: neilpang/acme.sh
    container_name: acme.sh
    command: daemon
    volumes:
      - ./acmeout:/acme.sh
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DEPLOY_DOCKER_CONTAINER_LABEL=sh.acme.autoload.domain=hehome.xyz
      - DEPLOY_DOCKER_CONTAINER_KEY_FILE="/etc/nginx/ssl/hehome.xyz.key"
      - DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE="/etc/nginx/ssl/fullchain.cer"
      - DEPLOY_DOCKER_CONTAINER_RELOAD_CMD="service nginx force-reload"

networks:
  default:
    external:
      name: website

Nginx 的配置,参考了 官方文档Typecho FAQ,如下:

server {
  listen 443 ssl;
  listen [::]:443 ssl;
  server_name hehome.xyz;

  access_log /var/log/nginx/hehome.xyz.log combined;

  root /app/typecho;
  index index.php;

  if (!-e $request_filename) {
    rewrite ^(.*)$ /index.php$1 last;
  }

  # 禁止对数据库的访问
  location ~ .*\.db$ {
    return 403;
  }

  location ~ .*\.php(\/.*)*$ {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    fastcgi_pass php-fpm:9000;
    fastcgi_index $document_root/index.php;

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_read_timeout 300;
  }

  location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Vary Accept-Encoding;
    access_log off;
  }

}
server {
  listen 80;
  listen [::]:80;
  server_name hehome.xyz;

  if ($host = hehome.xyz) {
    return 301 https://$host$request_uri;
  }

  return 404;
}

之前因为 IOT 网站用着 MySQL,当时就顺便在配置的时候让 Typecho 也跟着用着它,其实 SQLite3 完全能满足我们网页的需求。所以想着以后迁移数据方便,干脆也把数据库迁移一下吧。

有两种方法,第一种是利用 Typecho 提供的备份和恢复工具。步骤如下:

  • 控制台 - 备份
  • 重新部署,设置 Typecho 之后,再直接恢复

但是 Typecho 在备份说明中写道

此备份操作仅包含内容数据,并不会涉及任何设置信息
如果您的数据量过大,为了避免操作超时,建议您直接使用数据库提供的备份工具备份数据

所以想要完整备份,需要第二种,也就是利用数据库自带的工具。

  • 利用 mysqldump --skip-extended-insert --compact -uroot -p typecho > typecho.sql 备份 MySQL 数据库
  • 使用 mysql2sqlite 工具 ./mysql2sqlite typecho.sql | sqlite3 typecho.db 转换成 SQLite3 格式

注意:如果你像我一样直接将 SQLite3 数据库存放在 Typecho 文件夹内的,则需要在 Nginx 的设置中禁止对数据库的访问,以免未加密的数据库被下载。

标签: docker, typecho, docker-compose