主要过程
我的 typecho 是基于 docker compose 部署安装的。当前的 compose 文件如下
services:
typecho:
container_name: typecho
image: joyqi/typecho:1.3.0-php7.4-apache
restart: unless-stopped
environment:
TIMEZONE: Asia/Shanghai
TYPECHO_DB_HOST: mysql-typecho
TYPECHO_DB_USER: typecho
TYPECHO_DB_PASSWORD: xxx
TYPECHO_DB_DATABASE: typecho
TYPECHO_SITE_URL: https://blog.xxx.com
TYPECHO_USER_NAME: xxx
TYPECHO_USER_PASSWORD: xxx
TYPECHO_USER_MAIL: xxx
MAX_POST_BODY: 100M
networks:
- typecho-net
volumes:
- ./typecho-data-1.3.0:/app
ports:
- 8090:80
depends_on:
- mysql
mysql:
container_name: mysql-typecho
image: mysql:8.0.29
restart: unless-stopped
networks:
- typecho-net
volumes:
- ./mysql-data:/var/lib/mysql
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: xxx
MYSQL_DATABASE: xxx
MYSQL_USER: xxx
MYSQL_PASSWORD: xxx
networks:
typecho-net:
- 使用
docker compose up -d后台启动 - 使用
docker compose down删除网络、容器 - 注意是
docker compose,不是老旧的docker-compose - 如果有将上述 compose 文件命名的比较特殊,比如叫做
typecho.yml,运行 docker compose 命令时需加上-f typecho.yml
这里我踩了几个坑,因为我有几个 typecho 环境:
1.3.0版本建议使用这个镜像 joyqi/typecho:1.3.0-php7.4-apache,joyqi/typecho:1.3.0-php8.2-apache这个镜像由于 php 版本过高,有运行时兼容性问题,甚至 blog 系统无法正常工作。
1.2.1版本可以使用 joyqi/typecho:1.2.1-php8.0-apache 这个镜像,我的实测是OK的。
1.2.0版本可以使用 joyqi/typecho:1.2.0-php7.4-apache 这个镜像,我的实测是OK的。
typecho 系统运行之后关键的用户数据在 usr/ 目录下,我之前只挂载了这个目录,但是和 usr/ 目录同级的还有 config.inc.php、.htaccess 等关键文件,其中config.inc.php可以在新版本安装之后重新走一遍安装流程生成。所以我上面的 compose 文件,我将挂载的容器内目录改成了 /app(即./typecho-data-1.3.0:/app),原本只挂载了/app/usr,这样数据更全,更新系统更安全。
因为我开启了系统地址重写功能,所以容器内的 /etc/apache2/apache2.conf 文件也需要备份一下,在新环境里直接将此文件覆盖过去即可。
所以对于我的这种环境部署,更新typecho版本需要备份的关键数据有:
- 容器内
usr/目录,这是用户目录,所有的插件,主题,上传的文件都在这里 .htaccess文件,一般在容器内/app/.htaccess/etc/apache2/apache2.conf文件,备份它,新环境运行起来之后进入容器,使用这个文件替换原本的 apache2.conf 文件
好了,关键就是这三份文件,如果你在寻找 typecho 博客更新的一些文章,或者遇到什么更新困难,错误之类的问题,你需要考虑到你是不是用的 joyqi/typecho:1.3.0-php7.4-apache 这种镜像!!!这个镜像包含了 typecho php 服务和 apache2 服务!!!数据库服务是单独部署的。但有些镜像可能没有 apache2 web server 服务。
官方教程
再来说说官方的 upgrade 教程:https://docs.typecho.org/upgrade ,文中提到,更新 typecho 其实只需要升级这些文件,使用新版本的这些文件替换进去就行了。但因为我们是通过 docker 部署的,建议更新镜像 tag,作者除了维护这些文件,还有 php 运行时环境,可能还涉及到安全:比如镜像内基础镜像的更新、内核的更新。
/admin/
/var/
/index.php
/install.php
其他细碎问题
最后再说一点杂碎的可能被忽略的问题
- 如果你进入到了 /install.php 页面,点击之后没有反应,你需要考虑到你当前本地挂载的目录是否正确,比如更新了镜像版本之后,你依然使用原本的本地目录,但是挂载到了容器中的 /app 下(你原本挂载到容器中的 /app/usr),所以会造成安装失败
- 要关注容器内
/app是否有写入权限。所有者最好是www-data,权限最好是755,可以直接在宿主机修改权限和拥有者 - 新环境运行好之后可以将备份的 usr 目录完全替换新环境的 usr 目录,确保文件所有者和权限正确
- 安装界面选择了正确的数据库驱动后,对应的数据库主机(也就是 host),可以直接填写 mysql 容器的名称,同一个 compose stack 下运行的服务相互之间可以通过容器名称找到彼此
- 数据库挂载不要动,不论你是挂载到 volume 的,还是当前文件夹下的某个子文件夹,对应的容器内目录仍然是
/var/lib/mysql,数据库镜像tag也不需要更新 - 修改了容器内 apache2 的配置,比如
.htaccess或者/etc/apache2/apache2.conf文件,建议通过docker compose restart重启 stack 整个服务
大功告成!