使用 Docker 部署 Typecho 个人博客
我想要之后重装一下系统,准备先把 Typecho
给容器化,这样也方便我重装时迁移数据。查了查,感觉也不是很难。
首先 Typecho
需要 PHP
的运行环境,我选择了 Nginx 和 PHP-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
的设置中禁止对数据库的访问,以免未加密的数据库被下载。