Docker-compose安装typecho保姆级教程

前言

Typecho 浑身都透着她简洁的性格,就像一个苗条的美女那样吸引着你。以下内容全部在 Debian 11,架构为 x86_64 的服务器上进行(架构可以使用 arch 命令进行查看)。其他系统的服务器一般不会有太大的问题,如果有问题可以在下面留言,我尽力提供帮助

安装 Docker

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
# 安装完成后,可以用这个命令来验证是否安装成功:
docker -v

安装 Docker-Compose

可以在这里找到最新的版本,截至 2024 年 3 月24 日最新版本为 2.26.0,请自行寻找对应版本的链接

# 下载docker-compose可执行文件
sudo curl -L "https://github.com/docker/compose/releases/download/v2.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 添加执行权限
chmod +x /usr/local/bin/docker-compose
#验证
docker-compose --version

部署 Typecho

创建目录

# 这个命令在data不存在时,会同时创建 /data 和 /data/blog
mkdir -p /data/blog

然后在/blog目录下面创建以下内容

.
├── docker-compose.yml
├── logs
├── mysql
├── mysql.env
├── nginx
│   └── default.conf
├── php
│   └── Dockerfile
|── typecho
└── npm

编写./docker-compose.yml

version: "3"

services:
  nginx:
    image: nginx:1.22.0
    container_name: nginx-blog
    ports:
      - "8001:80"
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - PUID=0    # 想切换为哪个用户来运行程序,该用户的uid
      - PGID=0    # 想切换为哪个用户来运行程序,该用户的gid
    volumes:
      - ./typecho:/var/www/html
      - ./nginx:/etc/nginx/conf.d
      - ./logs:/var/log/nginx
    depends_on:
      - php
    networks:
      - web

  php:
    build: php
    restart: always
    container_name: php-blog
    expose:
      - "9000"
    volumes:
      - ./typecho:/var/www/html
    environment:
      - TZ=Asia/Shanghai
      - PUID=0    # 想切换为哪个用户来运行程序,该用户的uid
      - PGID=0    # 想切换为哪个用户来运行程序,该用户的gid
      - PHP_MAX_EXECUTION_TIME=600
      - PHP_MEMORY_LIMIT=128m
      - PHP_MAX_POST_BODY=10m
    depends_on:
      - mysql
    networks:
      - web

  mysql:
#   mysql的版本可以根据自己的喜欢去替换,内存大于或等于8GB的服务器可以使用8.0
    image: mysql:5.7
    restart: always
    container_name: mysql-blog
    environment:
      - TZ=Asia/Shanghai
      - PUID=0    # 想切换为哪个用户来运行程序,该用户的uid
      - PGID=0    # 想切换为哪个用户来运行程序,该用户的gid
    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
  npm:     
# npm反代
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    container_name: npm-blog
    ports:
      - '80:80'  # 保持默认即可,不建议修改左侧的80
      - '81:81'  # 冒号左边可以改成自己服务器未被占用的端口
      - '443:443' # 保持默认即可,不建议修改左侧的443
    volumes:
      - /data/blog/npm/data:/data # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 data 文件夹中
      - /data/blog/npm/letsencrypt:/etc/letsencrypt  # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 letsencrypt 文件夹中

networks:
  web:

编写./mysql.env

MYSQL_ROOT_PASSWORD=root_password
MYSQL_DATABASE=blog
MYSQL_USER=username
MYSQL_PASSWORD=user_password

编写./php/Dockerfile

其中 php 目录为 php-fpm 的 Dockerfile,在官方镜像的基础上,添加了 PDO_MYSQL(如果使用 MySQL 作为 Typecho 的数据库,则需安装此扩展),并设置 buffer4kb,即一个内存页。同时设置了时区为 RPC,来源于 issue: https://github.com/typecho/typecho/issues/1090,同时考虑到部分主题可能会用到redis加速缓存,因此添加了redis扩展的安装和启用步骤。

BASH
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
RUN pecl install redis \
  && docker-php-ext-enable redis \

编写./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;
  }
}

放置./typecho文件

下载 [Typecho](https://typecho.org/download) 博客的目录文件放置于这个目录下面

注意:如果 VPS 的内存比较小 ,推荐设置一下 SWAP,一般为内存的 1-1.5 倍即可~
wget https://www.moerats.com/usr/shell/swap.sh && bash swap.sh

启动与更新

需要在 docker-compose.yml 所在目录下面进行

# 启动
docker-compose up -d
# 停止
docker-compose stop
# 更新并启动
docker-compose pull
docker-compose up -d

NPM反向代理配置

Nginx proxy manager(以下简称 NPM)是一个很简单的反向代理工具。在添加反向代理之前,确保你已经完成了域名解析。因为前文中docker-compose文件已经包含了NPM镜像的构建,因此,理论上我们就可以输入 http://ip:81 访问了

#默认登陆名和密码:
admin@example.com
changeme

注意:

NPM会用到 80443 端口,所以本机不能占用(比如原来就有 Nginx)

1.添加反向代理image-20220502123517401

2.添加域名

image-20220507212548875

3.配置SSL证书

image-20220507212620260

image-20220403104353185

然后就可以用域名来安装并访问typecho后台了。

typecho后台安装配置

1.数据库对接

image-20220513212747473

此处需要注意,严格按照./mysql.env中的字段进行填写,填写无误后,点击开始安装,就可以进入控制台页面。

2.地址重写功能

image-20240325155232842

至此,大功告成,enjoy~

那些年踩过的坑

踩坑一

对接数据库之后点击开始安装,可能会出现如下报错:

image-20220513212726407

解决办法:在typecho根目录创建config.inc.php,并复制图中代码便可继续安装。

cd /data/blog/typecho

nano config.inc.php

踩坑二

无法上传图片

解决办法:

sudo chmod -R 777 /path/to/typecho/usr/uploads

踩坑三

数据库无法连接

解决办法:需要将./typecho/config.inc.php 里面的'host' => 'localhost' 修改为'host' => 'mysql'

2165489854

参考资料:

1、《博客搭建 | Docker-Compose 部署》https://p3ter.me/posts/docker_compose_build_blog.html

2、【好玩儿的 Docker 项目】10 分钟搭建一个 Typecho 博客|太破口!念念不忘,必有回响!https://blog.laoda.de/archives/docker-compose-install-typecho/#7-%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B



最后修改:2024 年 03 月 30 日
如果觉得我的文章对你有用,请随意赞赏