1. 准备工作

  • 购买服务器
  • 购买域名,并解析到服务器上https://www.namesilo.com/
  • 服务器安装好Docker和Docker-compose
  • 【非必需】服务器安装好Nginx Proxy Manager

2. 搭建Typecho

创建安装目录

mkdir -p /root/data/docker_data/typecho

cd /root/data/docker_data/typecho

2.1 mysql

cd /root/data/docker_data/typecho

vim mysql.env

填入

MYSQL_ROOT_PASSWORD=root_pass
MYSQL_DATABASE=typecho
MYSQL_USER=username
MYSQL_PASSWORD=password

2.2 php-fpm

cd /root/data/docker_data/typecho

mkdir php

cd php

vim Dockerfile

Dockerfile输入

FROM php:7.3.29-fpm
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

2.3 nginx

nginx 的配置要注意的是需要有rewrite规则(后续typecho后台有一个地址重写功能),如果需要指定域名的话,需要写 server_name 字段。这里并没有指定443端口,因为后面用到了反向代理。
cd /root/data/docker_data/typecho

mkdir nginx

cd nginx

vim default.conf

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;
    }
}

2.4 typecho

  • 下载源码
mkdir typecho

cd /root/data/docker_data/typecho/typecho

wget https://github.com/typecho/typecho/releases/download/v1.2.0/typecho.zip

apt install zip -y 

unzip typecho.zip
  • docker-compose
cd /root/data/docker_data/typecho

vim docker-compose.yml

docker-compose填入

version: "3"

services:
  nginx:
    image: nginx
    ports:
      - "8223:80"    # 左边可以改成任意没使用的端口
    restart: always
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./typecho:/var/www/html
      - ./nginx:/etc/nginx/conf.d
      - ./logs:/var/log/nginx
    depends_on:
      - php
    networks:
      - web

  php:
    build: php
    restart: always
    expose:
      - "9000"       # 不暴露公网,故没有写9000:9000
    volumes:
      - ./typecho:/var/www/html
    environment:
      - TZ=Asia/Shanghai
    depends_on:
      - mysql
    networks:
      - web

  mysql:
    image: mysql:5.7
    restart: always
    environment:
      - TZ=Asia/Shanghai
    expose:
      - "3306"  # 不暴露公网,故没有写3306:3306
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/logs:/var/log/mysql
      - ./mysql/conf:/etc/mysql/conf.d
    env_file:
      - mysql.env
    networks:
      - web

networks:
  web:

查看端口是否被占用

lsof -i:8223  #查看8223端口是否被占用,如果被占用,重新自定义一个端口
  • 运行
docker-compose up -d

3. 更新typecho

cd /root/data/docker_data/typecho  # 进入docker-compose所在的文件夹

docker-compose pull    # 拉取最新的镜像

docker-compose up -d   # 重新更新当前镜像

4. 卸载typecho

sudo -i  # 切换到root

cd /root/data/docker_data/typecho # 进入docker-compose所在的文件夹

docker-compose down    # 停止容器,此时不会删除映射到本地的数据

cd ~

rm -rf /root/data/docker_data/typecho  # 完全删除映射到本地的数据

5. 反向代理

http//:ip:81进入Nginx Proxy Manager

image-20241229165858823

ip填写:

如果Nginx Proxy Manager和reader在同一台服务器上,可以在终端输入:

ip addr show docker0
查看对应的Docker容器内部IP。

image-20241229173908569

6. 网页端安装typecho

image-20241229174533284

  • 数据库地址:填写容器名mysql
  • 用户名和密码在mysql.env中查看
  • 数据库名:typecho

若出现

image-20241229174733039

cd /root/data/docker_data/typecho/typecho
vim config.inc.php

然后填入以上内容,然后继续即可

7. 重定向次数太多

7.1 Cloudflare 的 SSL/TLS 设置

Cloudflare 提供不同的 SSL 模式(Flexible, Full, Full (Strict)):

  • Flexible SSL:Cloudflare 会使用 HTTP 与你的服务器进行连接,而与客户端之间使用 HTTPS。这意味着当你的服务器没有配置 SSL 证书时,Cloudflare 会强制使用 HTTPS,而服务器只会处理 HTTP 请求。
  • Full SSL:Cloudflare 与你的服务器之间使用 HTTPS,而与客户端之间依然是 HTTPS。
  • Full (Strict) SSL:Cloudflare 使用 HTTPS 与服务器进行通信,并且要求服务器提供有效的 SSL 证书。

问题

  • 如果 Cloudflare 设置为 Flexible SSL,但你在 Nginx Proxy Manager 中启用了 Force SSL,可能会出现 HTTP 与 HTTPS 的冲突,导致重定向循环。

解决方法

  • 如果你已经在 Nginx Proxy Manager 中启用了 SSL 并确保你的服务器上配置了有效的 SSL 证书,建议将 Cloudflare 的 SSL 设置更改为 FullFull (Strict)
  • 在 Cloudflare 中,进入“SSL/TLS”选项卡,将 SSL 模式设置为 FullFull (Strict),避免使用 Flexible

7.2 Cloudflare 的自动 HTTPS 重定向

Cloudflare 提供了一个选项叫做“Always Use HTTPS”,它会自动将所有 HTTP 请求重定向到 HTTPS。这可能与你在 Nginx Proxy Manager 中启用的“Force SSL”设置发生冲突。

问题

  • 如果你在 Cloudflare 中启用了 Always Use HTTPS,而 Nginx Proxy Manager 中也启用了 Force SSL,可能导致重定向次数过多。

解决方法

  • 在 Cloudflare 控制台中,禁用 Always Use HTTPS 选项。你可以在 Cloudflare 的“SSL/TLS”选项卡下找到这个设置。
  • 确保只在 Nginx Proxy Manager 中启用 Force SSL,避免在 Cloudflare 中再做同样的重定向设置。

7.3 云端缓存问题

Cloudflare 使用 CDN 并会缓存一些内容。即使你在 Nginx Proxy Manager 中做了更改,Cloudflare 可能会缓存之前的 HTTP 重定向或错误配置。

解决方法

  • 清除 Cloudflare 的缓存,确保最新的配置生效。你可以在 Cloudflare 控制台的“Caching”部分,点击“Purge Everything”来清除缓存。

7.4 检查 DNS 设置

确保你的域名的 DNS 记录指向正确的服务器 IP 地址,且设置为通过 Cloudflare 代理(即 orange cloud 图标启用)。如果 DNS 记录未通过 Cloudflare 代理,可能会直接访问你的服务器而绕过 Cloudflare,导致配置不一致。

7.5 总结

  • 将 Cloudflare 的 SSL 设置调整为 FullFull (Strict)
  • 禁用 Cloudflare 的 Always Use HTTPS,只在 Nginx Proxy Manager 中启用 Force SSL
  • 清除 Cloudflare 的缓存。
  • 检查 Cloudflare 的 DNS 配置,确保它通过 Cloudflare 代理流量。

8. typecho地址重写

image-20241229184946077

9. 更改主题

  • 下载主题文件,一般为压缩包,解压得到主题文件夹;
  • 将主题目录上传到/root/data/docker_data/typecho/typecho/usr/themes/中
  • 进入网站后台:控制台 -> 外观,启用该主题即可。

10. 关于ip addr show docker0

以下内容来自DeepSeek

image-20250104223252103

容器通过访问docker0地址即可访问宿主机

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