Docker部署Typecho


经验分享397 阅7 评

愚人节的时候,Typecho迎来了久违的更新,除了版本和环境的升级,还增加了对docker的支持。本来打算过段时间试一下,但意外发生了。

小故事

今天华为云的人突然给我打电话,说我的一个域名过期了,还不能访问。听到这,我都怀疑是诈骗了,因为域名是一月份购置了一年,备案完,我就将主域和子域全部解析到了华为的服务器上,并部署了NginxProxyManager做反向代理用。尽管我并没有做主域的内容,但是访问肯定是没有问题的。尽管心里很不爽,但还是顺着客服的意思,回复了邮件(邮件的域名确实是官方的)。

不知道是客服的问题,还是官方检测系统的问题,真的很降好感度。

本地部署测试

既然他们提醒了,那干脆放一个内容上去吧。联想到Typecho前些天的更新,就试一下Docker版的Typecho。

结果官方项目的使用方法,我很快在本地通过docker compose将typecho跑了起来。

# https://github.com/typecho/Dockerfile

version: '3'

services: 
  typecho: 
    container_name: typecho-server
    image: joyqi/typecho:nightly-php7.4-apache
    ports: 
      - 6881:80
    environment: 
      TIMEZONE: Asia/Shanghai
      MEMORY_LIMIT: 100M # PHP内存限制
      MAX_POST_BODY: 50M
      TYPECHO_INSTALL: 1 # 设置为1将运行自动安装脚本 
      TYPECHO_DB_ADAPTER: Pdo_SQLite # 数据驱动器Pdo_Mysql, Pdo_SQLite, Pdo_Pgsql, Mysqli, SQLite, Pgsql.
      # TYPECHO_DB_HOST: host
      # TYPECHO_DB_PORT: 3306
      # TYPECHO_DB_USER: user
      # TYPECHO_DB_PASSWORD: password
      # TYPECHO_DB_DATABASE: database
      TYPECHO_DB_FILE: /app/usr/typecho.db
      TYPECHO_DB_PREFIX: tpyecho_
      # TYPECHO_DB_ENGINE: InnoDB # 仅Mysql可用
      # TYPECHO_DB_CHARSET: utf8 # default: utf8(for pgsql) or utf8mb4(for mysql)
      TYPECHO_DB_NEXT: keep # none keep force
      TYPECHO_SITE_URL: http://127.0.0.1:6881
      TYPECHO_USER_NAME: username
      TYPECHO_USER_PASSWORD: password
      TYPECHO_USER_MAIL: admin@localhost.local
    volumes: 
      - ./data:/app/usr
    restart: unless-stopped

因为不会一直增加内容,所以我选择sqlite作为数据存储。经过一番调试之后,项目跑了起来。

线上部署

因为Docker版本加了自动部署的选项,所以如何使数据持久化存储(不需要每次启动docker都重新安装)就很多次。本以为线上就直接跑起来了,但是没有想到意外发生了。

按照本地测试通过的运行方式,到了线上竟然不能自动部署。本来以为是镜像的问题,但是换了其他版本的镜像还是不能使用。于是我决定干脆就直接手动安装吧,先看一下问题时出现在了哪里。

但没想到手动安装还是出现了问题,提示连接不到数据库。这我就纳闷了,sqlite数据库就一个db文件,连接不到创建一个就好了呀(程序里面肯定是有这一步的,不知道为啥没生效)。于是我干脆手动建一个,看看还能不能继续跑。意外还是来了,提示数据库有旧数据,点击了强制安装之后没办法进行。

到这里的时候,我大概明白了,可能是镜像没有映射出来的目录的写入权限。这个问题在群辉部署其他docker镜像的时候经常出现,开发者有些会允许传入PUID和PGID,使镜像正常工作。但如果没有开发者适配的话,需要将文件夹权限设置为所有人。

于是,再一次尝试过后,终于还是跑起来了。

最后说两句

使用docker+sqlite的方式部署Typecho,备份是非常简单的。但是,不知道我用的主题和插件会不会受到影响。所以还是暂时不会讲环境切到docker环境上,还有docker版本的虽然使用很方便,但是镜像的文件是真的大,毕竟放了一整个PHP环境,还不是共用的。

最后更新 2022-04-28
评论 ( 7 )
OωO
隐私评论
  1. 过来看看

    2个月前回复
    1. @吥乖

      常来玩呀

      2个月前回复
  2. docker部署确实省心,php和web服务器打包装好了,就是要注意数据目录要映射出去,不然重启就都没了

    2个月前回复
    1. @小彦

      数据确实是个比较麻烦的事情,这几天再搞服务器备份的事情。打算搞个自动同步,定时把数据本分到本地nas上

      2个月前回复
  3. 这两天玩docker玩到吐,我还是选择稳妥点放传统环境,怕有什么不兼容什么的问题出现

    3个月前回复
    1. @你当向往阳

      一开始没搞懂的时候也没觉得docker有多方便,现在用起来贼顺手,compose一写,数据目录直接保存在同级目录,备份脚本只需要备份整个目录就可以。

      3个月前回复
    2. @你当向往阳

      一般来说,开发者构建的比较好的话,用起来还是比较爽的,尤其是环境依赖没有那么严重的。

      传统部署部署稳定性肯定是毋庸置疑的,但是备份和部署起来是真的麻烦。国内的机子还好,一次几年购入,国外的想找个稳定的运行商,价格太高了。

      3个月前回复